Developer Area

root/apps/outlook/branches/1.6/DotTel/MSOutlook/Toolbars/ContactToolbar/InspectorToolbar.cs @ 646

Revision 646, 45.4 kB (checked in by jonmaycock, 4 years ago)

Bug Fixes

Line 
1///<summary>
2/// Author: Ben Dowling & Nick Brunwin
3///------------------------
4///Copyright (c) 2008, Telnic Ltd.
5///
6///All rights reserved.
7///
8///Redistribution and use in source and binary forms, with or
9///without modification, are permitted provided that the following
10///conditions are met:
11///
12///*    Redistributions of source code must retain the above
13///     copyright notice, this list of conditions and the
14///     following disclaimer.
15///*    Redistributions in binary form must reproduce the above
16///     copyright notice, this list of conditions and the following
17///     disclaimer in the documentation and/or other materials
18///     provided with the distribution.
19///*    Neither the name of the Telnic Ltd. nor the names of its
20///     contributors may be used to endorse or promote products
21///     derived from this software without specific prior written
22///     permission.
23///
24///THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
25///CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
26///INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
27///MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28///DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
29///CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30///SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31///LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
32///USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
33///AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34///LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
35///IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
36///THE POSSIBILITY OF SUCH DAMAGE.
37///--------------------------
38///</summary>
39using System;
40using System.Drawing;
41using System.Windows.Forms;
42using System.Collections.Generic;
43using Microsoft.VisualStudio.Tools.Applications.Runtime;
44using System.Text;
45using Outlook = Microsoft.Office.Interop.Outlook;
46using Office = Microsoft.Office.Core;
47using org.telnic.outlook.lookup;
48using org.telnic.outlook.dns;
49using org.telnic.outlook.util;
50using System.Collections;
51using System.Diagnostics;
52using System.Threading;
53using System.Net;
54using org.telnic.outlook.prefs;
55using org.telnic.outlook.friending;
56using org.telnic.outlook.friending.messaging;
57using org.telnic.outlook.uri;
58using org.telnic.outlook.screens;
59using org.telnic.outlook.msoutlook.toolbars.hook;
60using System.IO;
61
62namespace org.telnic.outlook.msoutlook.toolbars.contacttoolbar
63{
64    public class InspectorToolbar : LookupTelnameCompleteListener
65    {
66        private static int toolbars = 0;
67
68        private static string ADD_FRIEND_STRING = DotTel.Properties.Resources.InspectorToolbar_SendFriendingRequest;
69        private static string REMOVE_FRIEND_STRING = DotTel.Properties.Resources.InspectorToolbar_RemoveFriendStatus;
70
71        private int instanceNumber;
72        private Office.CommandBar inspectorBar;
73        private Office.CommandBarButton inspectorGoButton;
74        private Office.CommandBarButton editButton;
75        //private Office.CommandBarButton friendButton;
76        private Office.CommandBarComboBox inspectorTextBox;
77        private Office.CommandBarButton button_1;
78        private InspectorResultsScreen rs;
79        private Outlook.ContactItem contact;
80        //private LookupResult cachedResult;
81        private Outlook.Inspector inspector;
82
83        private Office.CommandBarPopup inspectorMenu;
84        private Office.CommandBarButton logInStatusButton;
85        private Office.CommandBarButton friendStatusButton;
86        private Office.CommandBarButton loginLogoutButton;
87        private Office.CommandBarButton sendRequestButton;
88
89        private static List<Office.CommandBar> commandBars = new List<Office.CommandBar>();
90
91        private static string PreferenceLocation = "InspectorToolbar.";
92        private static string LeftPositionPreferenceLocation = PreferenceLocation + "Left";
93        private static string RowPositionPreferenceLocation = PreferenceLocation + "Row";
94        private static string TopPositionPreferenceLocation = PreferenceLocation + "Top";
95        private static string ToolbarVisiblePreferenceLocation = PreferenceLocation + "Visible";
96        private static string ToolbarEnabledPreferenceLocation = PreferenceLocation + "Enabled";
97        private static string UsePDDXInformationPreferenceLocation = "servicemessage.pddx.use";
98        private static string CommandBarName = DotTel.Properties.Resources.TelContactToolbarName;
99
100        private bool closed = false;
101
102        public int Instance
103        {
104            get
105            {
106                return instanceNumber;
107            }
108        }
109
110        /// <summary>
111        /// Adds a toolbar to the given inspector
112        /// </summary>
113        /// <param name="inspector">The inspector to add the toolbar to</param>
114        public InspectorToolbar(Outlook.Inspector inspector)
115        {
116            if (!(inspector.CurrentItem is Outlook.ContactItem)) return;
117           
118            this.inspector = inspector;
119            Outlook.InspectorEvents_Event inspectorEvents = (Outlook.InspectorEvents_Event)inspector;
120            inspectorEvents.Close += new Microsoft.Office.Interop.Outlook.InspectorEvents_CloseEventHandler(inspectorEvents_Close);
121           
122            contact = (Outlook.ContactItem)inspector.CurrentItem;
123
124            Outlook.ItemEvents_Event itemEvents = (Outlook.ItemEvents_Event)contact;
125            itemEvents.Close += new Microsoft.Office.Interop.Outlook.ItemEvents_CloseEventHandler(itemEvents_Close);
126
127            instanceNumber = InspectorToolbar.toolbars++;
128
129            Logger.Log(Logger.Section.Contact_Toolbar, "New contact toolbar " + instanceNumber + " created. Contact has fullname \"" + contact.FullName + "\"");
130
131            // if the DotTel bar is already there remove it
132            try
133            {
134                inspector.CommandBars[InspectorToolbar.CommandBarName].Delete();
135            }
136            catch (Exception e)
137            {
138                // No problem, the DotTel bar doesn't exist
139                Logger.Log(Logger.Section.Contact_Toolbar, "Exception deleting existing toolbar: " + e.Message);
140            }
141
142            inspectorBar = inspector.CommandBars.Add(InspectorToolbar.CommandBarName, Office.MsoBarPosition.msoBarTop, Type.Missing, true);
143
144            bool showToolbar = true;
145            bool enableToolbar = true;
146
147            try
148            {
149                string left = Preferences.GetPreference(LeftPositionPreferenceLocation);
150                if (left != "")
151                {
152                    inspectorBar.Left = int.Parse(left);
153                }
154                string rowIndex = Preferences.GetPreference(RowPositionPreferenceLocation);
155                if (rowIndex != "")
156                {
157                    inspectorBar.RowIndex = int.Parse(rowIndex);
158                }
159                string top = Preferences.GetPreference(TopPositionPreferenceLocation);
160                if (top != "")
161                {
162                    inspectorBar.Top = int.Parse(top);
163                }
164                string toolbarVisible = Preferences.GetPreference(ToolbarVisiblePreferenceLocation);
165                if (toolbarVisible == false.ToString())
166                {
167                    showToolbar = false;
168                }
169                string toolbarEnabled = Preferences.GetPreference(ToolbarEnabledPreferenceLocation);
170                if (toolbarEnabled == false.ToString())
171                {
172                    enableToolbar = false;
173                }
174                /* Not used in the case of inspector toolbars because when the inspectors are cycled using the arrow keys it is best
175                 * to take the value from the just closed inspector rather than from whichever inspect is still open that was opened last.
176                try
177                {
178                    foreach (Office.CommandBar cb in InspectorToolbar.commandBars)
179                    {
180                        showToolbar = cb.Visible;
181                    }
182                }
183                catch (Exception e)
184                {
185                    Logger.Log(Logger.Section.Contact_Toolbar, "Exception examining other toolbars: " + e);
186                }*/
187                Logger.Log(Logger.Section.Contact_Toolbar, "The inspector toolbar will be shown: " + showToolbar.ToString());
188            }
189            catch (Exception e)
190            {
191                Logger.Log(Logger.Section.Contact_Toolbar, "Exception parsing toolbar position: " + e);
192            }
193
194            commandBars.Add(inspectorBar);
195
196            button_1 = (Office.CommandBarButton)inspectorBar.Controls.Add(Office.MsoControlType.msoControlButton, Type.Missing, Type.Missing, Type.Missing, true);
197            button_1.Style = Office.MsoButtonStyle.msoButtonIconAndCaption;
198
199            // this button does nothing but is there for branding
200            button_1.Caption = DotTel.Properties.Resources.InspectorToolbar_DotTelDomainCaption;
201            button_1.Tag = "button1" + instanceNumber;
202            button_1.Picture = ImgConverter.GettIPictureDispFromPicture(global::DotTel.Properties.Resources.tel_image);
203            button_1.Mask = ImgConverter.GettIPictureDispFromPicture(global::DotTel.Properties.Resources.tel16_mask);
204            button_1.Visible = true;           
205           
206            // custom textbox for entering and editing the contact's dottel domain
207            inspectorTextBox = CustomEditControl.createNew(inspectorBar, "inspectorTextBoxTag" + instanceNumber, CustomEditControl.ControlType.Text, new CustomEditControl.OnEnterDelegate(SaveTelname)); 
208            inspectorTextBox.Text = GetTelname();
209            inspectorTextBox.Width = 150;
210            inspectorTextBox.Enabled = true;
211            string telname = this.GetTelname();
212            bool viewMode = telname != "" && (TelnameChecker.IsValid(telname) || TelnameChecker.IsEnum(telname));
213            if (viewMode)
214            {
215                inspectorTextBox.Enabled = false;
216            }
217
218            // looks up the entered domain
219            inspectorGoButton = (Office.CommandBarButton)inspectorBar.Controls.Add(
220                            Office.MsoControlType.msoControlButton, Type.Missing, Type.Missing, Type.Missing, true);
221            inspectorGoButton.TooltipText = DotTel.Properties.Resources.InspectorToolbar_GoToolTipText;
222            inspectorGoButton.FaceId = 1018;
223            inspectorGoButton.Style = Microsoft.Office.Core.MsoButtonStyle.msoButtonCaption; //.msoButtonIconAndCaption;
224            inspectorGoButton.Caption = DotTel.Properties.Resources.InspectorToolbar_LookupButtonCaption;
225            inspectorGoButton.Tag = "inspectorGoButtonTag" + instanceNumber;
226            inspectorGoButton.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(inspectorGoButton_Click);
227            inspectorGoButton.Enabled = false;
228            if (viewMode)
229            {
230                inspectorGoButton.Enabled = true;
231            }
232           
233            // edit/save button for allowing the text box to be editted and its contents saved
234            editButton = (Office.CommandBarButton)inspectorBar.Controls.Add(Office.MsoControlType.msoControlButton, Type.Missing, Type.Missing, Type.Missing, true);
235            editButton.Caption = DotTel.Properties.Resources.InspectorToolbar_SaveButtonCaption;
236            if (viewMode)
237            {
238                editButton.Caption = DotTel.Properties.Resources.InspectorToolbar_EditButtonCaption;
239            }
240            editButton.Tag = "inspectorEditButton" + instanceNumber;
241            editButton.Style = Microsoft.Office.Core.MsoButtonStyle.msoButtonCaption;
242            editButton.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(editButton_Click);
243
244
245            // clicking this also does nothing, enabled when the contact is a friend, disabled otherwise
246            /*friendButton = (Office.CommandBarButton)inspectorBar.Controls.Add(Office.MsoControlType.msoControlButton, Type.Missing, Type.Missing, Type.Missing, true);
247            friendButton.TooltipText = DotTel.Properties.Resources.InspectorToolbar_FriendStatusToolTipText;
248            friendButton.FaceId = 2950;
249            friendButton.Style = Microsoft.Office.Core.MsoButtonStyle.msoButtonIconAndCaption;
250            friendButton.Tag = "friendButtonTag" + instanceNumber;
251            friendButton.Enabled = false;*/
252
253            // pop-up menu to hide the send/cancel friend request button
254            inspectorMenu = (Office.CommandBarPopup)inspectorBar.Controls.Add
255                (Office.MsoControlType.msoControlPopup, Type.Missing, Type.Missing, Type.Missing, true);
256            inspectorMenu.Tag = "inspectorMenuTag" + instanceNumber;
257
258            // Log-in status "button"
259            logInStatusButton = (Office.CommandBarButton)inspectorMenu.Controls.
260                            Add(Office.MsoControlType.msoControlButton, Type.Missing, Type.Missing, Type.Missing, true);
261            logInStatusButton.Style = Office.MsoButtonStyle.msoButtonIconAndCaption;
262            logInStatusButton.Tag = "logInStatusButtonTag" + instanceNumber;
263            logInStatusButton.Enabled = false;
264
265            // Log-in status "button"
266            friendStatusButton = (Office.CommandBarButton)inspectorMenu.Controls.
267                            Add(Office.MsoControlType.msoControlButton, Type.Missing, Type.Missing, Type.Missing, true);
268            friendStatusButton.Style = Office.MsoButtonStyle.msoButtonIconAndCaption;
269            friendStatusButton.Tag = "friendStatusButtonTag" + instanceNumber;
270            friendStatusButton.Enabled = false;
271
272            // Send/Cancel friend request button
273            loginLogoutButton = (Office.CommandBarButton)inspectorMenu.Controls.
274                            Add(Office.MsoControlType.msoControlButton, Type.Missing, Type.Missing, Type.Missing, true);
275            loginLogoutButton.Style = Office.MsoButtonStyle.msoButtonIconAndCaption;
276            loginLogoutButton.Tag = "loginLogoutButtonTag" + instanceNumber;
277            loginLogoutButton.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(loginLogoutButton_Click);
278
279            // Send/Cancel friend request button
280            sendRequestButton = (Office.CommandBarButton)inspectorMenu.Controls.
281                Add(Office.MsoControlType.msoControlButton, Type.Missing, Type.Missing, Type.Missing, true);
282            sendRequestButton.Style = Office.MsoButtonStyle.msoButtonIconAndCaption;
283            sendRequestButton.Tag = "sendRequestButtonTag" + instanceNumber;
284            sendRequestButton.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(sendRequestButton_Click);
285
286            this.SetFriendingComponents();
287            Logger.Log(Logger.Section.Contact_Toolbar, "Before AutoLookupThread");
288            // perform a lookup
289            Thread t = new Thread(delegate()
290            {
291                Logger.Log(Logger.Section.Contact_Toolbar, "Start of AutoLookupThread");
292                this.AutoLookup();
293                Logger.Log(Logger.Section.Contact_Toolbar, "End of AutoLookupThread");
294            });
295            t.Name = "AutoLookup Thread";
296            t.Start();
297            Logger.Log(Logger.Section.Contact_Toolbar, "After Launching AutoLookup Thread");
298
299            Publishers.Instance.publishersListUpdated += new Publishers.PublishersListUpdatedHandler(publishersListUpdated);
300            Friending.Instance.stateChanged += new Friending.StateChangedHandler(Instance_stateChanged);
301
302            inspectorBar.Visible = showToolbar;
303            inspectorBar.Enabled = enableToolbar;
304        }
305
306        void itemEvents_Close(ref bool Cancel)
307        {
308            Logger.Log(Logger.Section.Contact_Toolbar, "The contact item is being closed");
309            this.inspectorEvents_Close();
310        }
311
312        /// <summary>
313        /// Logs the user in or out as appropriate
314        /// </summary>
315        /// <param name="Ctrl"></param>
316        /// <param name="CancelDefault"></param>
317        void loginLogoutButton_Click(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool CancelDefault)
318        {
319            if (Friending.Instance.SigninState.Equals(Friending.SIGNEDIN))
320            {
321                Friending.Instance.SignOut();
322            }
323            else
324            {
325                Friending.Instance.SignIn();
326            }
327        }
328
329        /// <summary>
330        /// Either sends a friend request or attempts to remove a friend from the publishers list
331        /// depending on the state of the button.
332        /// </summary>
333        void sendRequestButton_Click(Microsoft.Office.Core.CommandBarButton ctrl, ref bool CancelDefault)
334        {
335            try
336            {
337                if (ctrl.Caption == ADD_FRIEND_STRING)
338                {
339                    Messaging.Instance.AddFriend(this.GetTelname());
340                }
341                else if (ctrl.Caption == REMOVE_FRIEND_STRING)
342                {
343                    try
344                    {
345                        Messaging.Instance.RemoveFriend(this.GetTelname());
346                    }
347                    catch (Exception e)
348                    {
349                        MessageBox.Show(String.Format(
350                            DotTel.Properties.Resources.InspectorToolbar_AProblemOccurredRemovingTheFriend, e.Message),
351                            DotTel.Properties.Resources.DottelError, MessageBoxButtons.OK, MessageBoxIcon.Error);
352                        Logger.Log(Logger.Section.Contact_Toolbar, "Problem with removing friend: " + e.Message);
353                    }
354                    // redraw the friend status
355                    // update the publishers list
356                }
357                // update the UI components
358                this.SetFriendingComponents();
359            }
360            catch (Exception ex)
361            {
362                Logger.Log(Logger.Section.Contact_Toolbar, "Problem with friending action: " + ex.Message);
363            }
364        }
365
366        /// <summary>
367        /// Either saves or allows editing of the contacts telname depending on the
368        /// current state of the UI.
369        /// </summary>
370        void editButton_Click(Microsoft.Office.Core.CommandBarButton ctrl, ref bool cancelDefault)
371        {
372            if (ctrl.Caption == DotTel.Properties.Resources.InspectorToolbar_EditButtonCaption)
373            {
374                inspectorTextBox.Enabled = true;
375                inspectorGoButton.Enabled = false;
376                inspectorTextBox.SetFocus();
377                editButton.Caption = DotTel.Properties.Resources.InspectorToolbar_SaveButtonCaption;
378            }
379            else if (ctrl.Caption == DotTel.Properties.Resources.InspectorToolbar_SaveButtonCaption)
380            {
381                this.SaveTelname();
382            }
383            this.SetFriendingComponents();
384        }
385
386        /// <summary>
387        /// Performs a lookup when the go button is clicked
388        /// </summary>
389        void inspectorGoButton_Click(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool CancelDefault)
390        {
391            this.DoLookup();
392            inspectorGoButton.Caption = DotTel.Properties.Resources.InspectorToolbar_LookupButtonCaption;
393        }
394
395        /// <summary>
396        /// To be called when the friending instance's login state changes
397        /// </summary>
398        void Instance_stateChanged(object sender, EventArgs e)
399        {
400            this.SetFriendingComponents();
401        }
402
403        /// <summary>
404        /// To be called when the publishers list is updated
405        /// </summary>
406        void publishersListUpdated(object sender, EventArgs e)
407        {
408            this.SetFriendingComponents();
409        }
410
411        /// <summary>
412        /// Sets the state of toolbar elements based on the login status of the user
413        /// and their friendship status to the contact
414        /// </summary>
415        private void SetFriendingComponents()
416        {
417            try
418            {
419                ///set all the icons and text here
420                ///add the send/cancel button as necessary
421
422                if (Friending.Instance.SigninState == Friending.SIGNEDIN)
423                {
424                    logInStatusButton.Caption = DotTel.Properties.Resources.InspectorToolbar_StatusLoggedIn;
425                    logInStatusButton.FaceId = 2308;    //chain
426                    this.loginLogoutButton.Caption = DotTel.Properties.Resources.InspectorToolbar_LogOut;
427                    this.loginLogoutButton.FaceId = 519; //padlock
428                    this.loginLogoutButton.Enabled = true;
429                }
430                else if (Friending.Instance.SigninState == Friending.SIGNINGIN || Friending.Instance.PromptingForInformation)
431                {
432                    logInStatusButton.Caption = DotTel.Properties.Resources.InspectorToolbar_StatusLoggingIn;
433                    logInStatusButton.FaceId = 2309;    //broken chain
434                    this.loginLogoutButton.Caption = DotTel.Properties.Resources.InspectorToolbar_LoggingInButtonText;
435                    this.loginLogoutButton.FaceId = 505; //large key pointing down
436                    this.loginLogoutButton.Enabled = false;
437                }
438                else
439                {
440                    logInStatusButton.Caption = DotTel.Properties.Resources.InspectorToolbar_StatusLoggedOut;
441                    logInStatusButton.FaceId = 2309;    //broken chain
442                    this.loginLogoutButton.Caption = DotTel.Properties.Resources.InspectorToolbar_LogIn;
443                    this.loginLogoutButton.FaceId = 277;    //small key
444                    this.loginLogoutButton.Enabled = true;
445                }
446
447                string telname = this.GetTelname();
448                //need to be signed in, not editing the telname and the contact have a telname to allow friending actions
449                if (Friending.Instance.SigninState.Equals(Friending.SIGNEDIN) && telname.Length > 0
450                            && (editButton.Caption == DotTel.Properties.Resources.InspectorToolbar_EditButtonCaption))
451                {
452                    //if (Publishers.Instance.PublisherList.ContainsKey(telname))
453                    if (Publishers.Instance.GetPrivateTelname(telname) != telname)
454                    {
455                        // enable the friend button only if this domain is in the publishers list
456
457                        this.inspectorMenu.Caption = DotTel.Properties.Resources.InspectorToolbar_Friended;
458                        this.friendStatusButton.Caption = DotTel.Properties.Resources.InspectorToolbar_FriendStatusFriended;
459                        this.friendStatusButton.FaceId = 2131;   //two faces
460
461                        // set the status of the friending action
462                        this.sendRequestButton.Caption = REMOVE_FRIEND_STRING;
463                        this.sendRequestButton.FaceId = 3734;
464                    }
465                    else
466                    {
467                        this.inspectorMenu.Caption = DotTel.Properties.Resources.InspectorToolbar_NotFriended;
468                        this.friendStatusButton.Caption = DotTel.Properties.Resources.InspectorToolbar_FriendStatusNotFriended;
469                        this.friendStatusButton.FaceId = 3734;   //two faces and a cross
470
471                        this.sendRequestButton.Caption = ADD_FRIEND_STRING;
472                        this.sendRequestButton.FaceId = 3710;
473                    }
474                    this.sendRequestButton.Enabled = true;
475                }
476                else
477                {
478                    this.inspectorMenu.Caption = DotTel.Properties.Resources.InspectorToolbar_FriendUnknown;
479                    this.friendStatusButton.Caption = DotTel.Properties.Resources.InspectorToolbar_FriendStatusFriendUnknown;
480                    this.friendStatusButton.FaceId = 926;    //question mark
481
482                    //this.friendButton.Enabled = false;
483                    this.sendRequestButton.Enabled = false;
484                    if (!Friending.Instance.SigninState.Equals(Friending.SIGNEDIN))
485                    {
486                        this.sendRequestButton.Caption
487                            = DotTel.Properties.Resources.InspectorToolbar_SendFriendRequestButtonCaptionIfNotLoggedIn;
488                    }
489                    else if (editButton.Caption != DotTel.Properties.Resources.InspectorToolbar_EditButtonCaption)
490                    {
491                        this.sendRequestButton.Caption
492                            = DotTel.Properties.Resources.InspectorToolbar_SendFriendRequestButtonCaptionIfNotSaved;
493                    }
494                    else
495                    {
496                        this.sendRequestButton.Caption
497                            = DotTel.Properties.Resources.InspectorToolbar_SendFriendRequestButtonCaptionIfNoTelname;
498                    }
499                    this.sendRequestButton.FaceId = 1954; //Information icon
500
501                }
502
503            }
504            catch (Exception e)
505            {
506                Logger.Log(Logger.Section.Contact_Toolbar, "Exception setting friend components: " + e);   
507            }
508        }
509
510        /// <summary>
511        /// Shuts down the inspector
512        /// </summary>
513        void inspectorEvents_Close()
514        {
515            Logger.Log(Logger.Section.Contact_Toolbar, "The toolbar is working with a close event");
516            lock (this)
517            {
518                if (!this.closed)
519                {
520                    this.closed = true;
521                    try
522                    {
523                        SavePosition(this.inspectorBar);
524                        Preferences.SavePreferences();
525                        lock (InspectorToolbar.commandBars)
526                        {
527                            InspectorToolbar.commandBars.Remove(this.inspectorBar);
528                        }
529                        Logger.Log(Logger.Section.Contact_Toolbar, "Removed toolbar from list");
530                    }
531                    catch (Exception)
532                    {
533                        Logger.Log(Logger.Section.Contact_Toolbar, "Exception saving toolbar position");
534                    }
535                    // if the DotTel bar is already there remove it
536                    try
537                    {
538                        if (rs != null)
539                        {
540                            rs.Close();
541                            rs = null;
542                        }
543                        this.inspectorBar.Delete();
544                    }
545                    catch (Exception e)
546                    {
547                        // No problem, the DotTel bar doesn't exist
548                        Logger.Log(Logger.Section.Contact_Toolbar, "Exception closing inspector toolbar: " + e.Message);
549                    }
550
551                    Logger.Log(Logger.Section.Contact_Toolbar, "Closing down toolbar for " + this.GetTelname());
552
553                    Publishers.Instance.publishersListUpdated -= new Publishers.PublishersListUpdatedHandler(publishersListUpdated);
554                    Friending.Instance.stateChanged -= new Friending.StateChangedHandler(Instance_stateChanged);
555                    Outlook.InspectorEvents_Event inspectorEvents = (Outlook.InspectorEvents_Event)this.inspector;
556                    inspectorEvents.Close -= new Microsoft.Office.Interop.Outlook.InspectorEvents_CloseEventHandler(inspectorEvents_Close);
557                    inspectorGoButton.Click -= new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(inspectorGoButton_Click);
558                    editButton.Click -= new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(editButton_Click);
559                    sendRequestButton.Click -= new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(sendRequestButton_Click);
560                    Outlook.ItemEvents_Event itemEvents = (Outlook.ItemEvents_Event)this.contact;
561                    itemEvents.Close -= new Microsoft.Office.Interop.Outlook.ItemEvents_CloseEventHandler(itemEvents_Close);
562                    inspectorEvents = null;
563                    this.inspectorBar = null;
564                    this.inspectorGoButton = null;
565                    this.button_1 = null;
566                    this.editButton = null;
567                    //this.friendButton = null;
568                    this.inspectorTextBox = null;
569                    this.inspectorMenu = null;
570                    this.logInStatusButton = null;
571                    this.friendStatusButton = null;
572                    this.loginLogoutButton = null;
573                    this.sendRequestButton = null;
574                    this.contact = null;
575                    //this.cachedResult = null;
576                    this.inspector = null;
577                    Logger.Log(Logger.Section.Contact_Toolbar, "Close complete on: " + this.ToString());
578                }
579            }
580        }
581
582        /// <summary>
583        /// Saves the position of the given command bar.
584        /// </summary>
585        /// <param name="cb">The commandbar to save the position of</param>
586        private static void SavePosition(Office.CommandBar cb)
587        {
588            Logger.Log(Logger.Section.Contact_Toolbar, "Saving toolbar position");
589            int left = cb.Left;
590            int rowIndex = cb.RowIndex;
591            int top = cb.Top;
592            bool visible = cb.Visible;
593            bool enabled = cb.Enabled;
594            cb.Delete();
595            Preferences.SetPreference(LeftPositionPreferenceLocation, left.ToString());
596            Preferences.SetPreference(RowPositionPreferenceLocation, rowIndex.ToString());
597            Preferences.SetPreference(TopPositionPreferenceLocation, top.ToString());
598            Preferences.SetPreference(ToolbarVisiblePreferenceLocation, visible.ToString());
599            Preferences.SetPreference(ToolbarEnabledPreferenceLocation, enabled.ToString());
600        }
601
602        /*
603         * Calling this when the addin is shutdown seems to cause outlook to have an error internally. 
604         * The open inspectors are closed by outlook before this is called anyway.
605        public static void ShutDown()
606        {
607            lock (InspectorToolbar.commandBars)
608            {
609                try
610                {
611                    Logger.Log(Logger.Section.Contact_Toolbar, "Shutting down explorerbars");
612                    foreach (Office.CommandBar cb in InspectorToolbar.commandBars)
613                    {
614                        try
615                        {
616                            SavePosition(cb);
617                        }
618                        catch (Exception e)
619                        {
620                            Logger.Log(Logger.Section.Contact_Toolbar, "Exception saving toolbar position: " + e);
621                        }
622                    }
623                    Preferences.SavePreferences();
624                }
625                catch (Exception) { }
626            }
627        }
628         * */
629
630        /// <summary>
631        /// Looks up the contacts telname in the background and gets the cached copy of the contact's
632        /// details for comparison.
633        /// </summary>
634        private void AutoLookup()
635        {
636            // get a copy of a cached result
637            string telname = this.GetTelname();
638            Logger.Log(Logger.Section.Contact_Toolbar, "Performing lookup of " + telname);
639            if (telname != "" && (TelnameChecker.IsValid(telname) || TelnameChecker.IsEnum(telname)))
640            {
641
642                // perform a background lookup (cache) operation with us as the listener
643                LookupTelname lt = new LookupTelname(IPAddress.Parse(Preferences.GetPreference("dns")), int.Parse(Preferences.GetPreference("dnsport")));
644                lt.Listener = this;
645                string privateTelname = Publishers.Instance.GetPrivateTelname(telname);
646                if (inspectorGoButton == null)
647                    return;
648
649                //Only want private result cache - otherwise it might have changed anyway
650                //this.cachedResult = LookupCache.GetResult(privateTelname);
651                //if (this.cachedResult == null)
652                //{
653                //    this.cachedResult = LookupCache.GetResult(telname);
654                //}
655                LookupResult cachedResult = LookupCache.GetResult(privateTelname);
656                if (cachedResult != null && cachedResult.Changed)
657                {
658                    inspectorGoButton.Caption = DotTel.Properties.Resources.InspectorToolbar_ViewCHANGEDCaption;
659                    this.SetFriendingMenu(cachedResult);
660
661                    return; //no need to do the look up
662                }
663
664                lt.performLookup(privateTelname, telname);
665            }
666        }
667
668        private void SetFriendingMenu(LookupResult result)
669        {
670            if (Preferences.GetPreference(UsePDDXInformationPreferenceLocation) != false.ToString())
671            {
672                this.inspectorMenu.Enabled = result.CanBeFriended;
673                if (!result.CanBeFriended)
674                {
675                    this.inspectorMenu.Caption = DotTel.Properties.Resources.InspectorToolbar_FriendStatusCannotBeFriended;
676                }
677            }
678            else
679            {
680                this.inspectorMenu.Enabled = true;
681            }
682        }
683
684        /// <summary>
685        /// Called once the lookup started by the autolookup method is complete
686        /// </summary>
687        /// <param name="lr">The result of the completed lookup</param>
688        public void LookupTelnameComplete(LookupResult lr)
689        {
690            // the inspector may no longer exist
691            if (this.inspectorGoButton == null)
692                return;
693            try
694            {
695                if (lr.NaptrStatus == LookupWorker.LookupStatus.Nxdomain
696                                                                    && lr.Telname.Split(new char[] {'.'}).Length > 2)
697                {
698                    //lookup domain above instead
699                    string parentDomain = this.GetTelname();
700
701                    LookupTelname lt = new LookupTelname(IPAddress.Parse(Preferences.GetPreference("dns")), 
702                                                                    int.Parse(Preferences.GetPreference("dnsport")));
703                    lt.Listener = this;
704                    lt.performLookup(parentDomain, parentDomain);
705                    return;
706                }
707
708                // compare the results of the lookup
709                if (lr.Changed)//!lr.equals(cachedResult))
710                {
711                    Logger.Log(Logger.Section.Contact_Toolbar, "Lookup results have changed for " + lr.Telname);
712
713                    // highlight/change icon if the caches aren't equal
714                    inspectorGoButton.Caption = DotTel.Properties.Resources.InspectorToolbar_ViewCHANGEDCaption;
715                }
716
717                this.SetFriendingMenu(lr);
718            }
719            catch (Exception e)
720            {
721                // it doesn't exist, don't do anything
722                Logger.Log(Logger.Section.Contact_Toolbar, "Exception in lookup complete: " + e);
723            }
724        }
725
726        /*
727        /// <summary>
728        /// Launches the contact
729        /// -- doesn't appear to be used anymore - I'm not entirely sure of it's purpose
730        /// -- consider removing
731        /// </summary>
732        /// <param name="ctrl"></param>
733        /// <param name="cancel"></param>
734        private void ContactLaunch(Office.CommandBarButton ctrl, ref bool cancel)
735        {
736            // the launchable uri is stored as the tooltip
737            UriHandler.getInstance().Launch(ctrl.TooltipText);
738        }*/
739
740        /// <summary>
741        /// Adjusts the UI and saves the telname to the contact
742        /// </summary>
743        private void SaveTelname()
744        {
745            Logger.Log(Logger.Section.Contact_Toolbar, "Save Telname called");
746            try
747            {
748                string text = inspectorTextBox.Text.ToLower();
749                Logger.Log(Logger.Section.Contact_Toolbar, "Textbox contains: " + text);
750                text = TelnameChecker.FixTelname(text);
751                if (text != null)
752                {
753                    inspectorTextBox.Text = text;
754                    Logger.Log(Logger.Section.Contact_Toolbar, "Textbox now contains: " + text);
755                }
756                string telname = inspectorTextBox.Text.ToLower();
757
758                if (telname.Length == 0)
759                {
760                    inspectorGoButton.Enabled = false;
761                    inspectorTextBox.Enabled = true;
762                    editButton.Caption = editButton.Caption = DotTel.Properties.Resources.InspectorToolbar_SaveButtonCaption;
763                    Logger.Log(Logger.Section.Contact_Toolbar, "Domain has length 0");
764                }
765                else if (!(TelnameChecker.IsValid(telname) || TelnameChecker.IsEnum(telname)))
766                {
767                    Logger.Log(Logger.Section.Contact_Toolbar, "Invalid domain: " + telname);
768                    if (DialogResult.Yes == MessageBox.Show(String.Format(
769                        DotTel.Properties.Resources.InspectorToolbar_IsAnInvalidTelDomainWouldYouLikeToViewTheHelpFile,
770                                            telname), DotTel.Properties.Resources.DottelError, MessageBoxButtons.YesNo, 
771                                                                                                   MessageBoxIcon.Error))
772                    {
773                        InspectorToolbar.LaunchDomainHelp();
774                    }
775                }
776                else
777                {
778                    inspectorGoButton.Enabled = true;
779                    inspectorTextBox.Enabled = false;
780                    editButton.Caption = DotTel.Properties.Resources.InspectorToolbar_EditButtonCaption;
781                }
782
783                this.SetTelname(telname);
784                this.SetFriendingComponents();
785
786                // perform a lookup
787                Thread t = new Thread(delegate()
788                {
789                    this.AutoLookup();
790                });
791                t.Name = "AutoLookup Thread";
792                t.Start();
793
794                Logger.Log(Logger.Section.Contact_Toolbar, "Save Telname - Success!");
795            }
796            catch(Exception e)
797            {
798                Logger.Log(Logger.Section.Contact_Toolbar, "saveTelname exception: " + this.GetTelname() + " -  "+ e.StackTrace);
799                MessageBox.Show(DotTel.Properties.Resources.InspectorToolbar_InvalidDotTelDomain, 
800                                DotTel.Properties.Resources.DottelError, MessageBoxButtons.OK, MessageBoxIcon.Error);
801               
802                String telname = this.GetTelname();
803                inspectorTextBox.Text = telname;
804
805                if (telname != "" && (TelnameChecker.IsValid(telname) || TelnameChecker.IsEnum(telname)))
806                {
807                    inspectorTextBox.Enabled = false;
808                    inspectorGoButton.Enabled = true;
809                    editButton.Caption = DotTel.Properties.Resources.InspectorToolbar_EditButtonCaption;
810                }
811                this.SetFriendingComponents();
812            }
813        }
814
815        /// <summary>
816        /// Launches the help page in a browser
817        /// </summary>
818        private static void LaunchDomainHelp()
819        {
820            /* Changed now help file is not included with plugin
821            if (ThisAddIn.DoesImportantFileExist(ThisAddIn.Path + DotTel.Properties.Resources.HelpHtmlRelativePath)
822                            && ThisAddIn.DoesImportantFileExist(ThisAddIn.Path + DotTel.Properties.Resources.DomainHelpHtmlRelativePath))
823            {
824                string helpfile = "file://" + ThisAddIn.Path + DotTel.Properties.Resources.DomainHelpHtmlRelativePath;
825                try
826                {
827                    // launch the uri
828                    System.Diagnostics.Process.Start(helpfile);
829                }
830                catch (Exception ex)
831                {
832                    Logger.Log(Logger.Section.Main_Toolbar, "Cannot launch help file url (" + helpfile + "): " + ex.Message);
833                    MessageBox.Show(DotTel.Properties.Resources.ExplorerToolbar_CannotDisplayHelp,
834                                    DotTel.Properties.Resources.DottelError, MessageBoxButtons.OK, MessageBoxIcon.Error);
835                }
836            }
837            else
838            {
839                MessageBox.Show(DotTel.Properties.Resources.ExplorerToolbar_CannotDisplayHelp,
840                                    DotTel.Properties.Resources.DottelError, MessageBoxButtons.OK, MessageBoxIcon.Error);
841            }
842             * */
843            string helpfile = DotTel.Properties.Resources.OnlineOutlookHelpURL_Domains;
844            try
845            {
846                // launch the uri
847                System.Diagnostics.Process.Start(helpfile);
848            }
849            catch (Exception ex)
850            {
851                Logger.Log(Logger.Section.Contact_Toolbar, "Cannot launch help file url (" + helpfile + "): " + ex.Message);
852                MessageBox.Show(DotTel.Properties.Resources.InspectorToolbar_CannotDisplayHelp,
853                                DotTel.Properties.Resources.DottelError, MessageBoxButtons.OK, MessageBoxIcon.Error);
854            }
855        }
856
857        /// <summary>
858        /// Launches a results screen and performs a lookup in a new thread
859        /// </summary>
860        private void DoLookup()
861        {
862            rs = new InspectorResultsScreen(contact, this, GetTelname());
863            Thread t = new Thread(delegate() 
864            {
865                new Lookup().PerformLookup(GetTelname(), rs);
866            });
867
868            t.Name = "Inspector Lookup Thread";
869            t.Start();
870        }
871
872        /// <summary>
873        /// Gets the saved telname of the contact if one exists
874        /// </summary>
875        /// <returns></returns>
876        private string GetTelname()
877        {
878            string telname = "";
879            try
880            {
881                Outlook.ItemProperty p = contact.ItemProperties[ThisAddIn.DotTelDomainContactField];
882                telname = (string)p.Value;
883            }
884            catch (Exception)
885            {
886                // property doesn't exist yet. Lets add it - actually lets not unless there is a value to save
887                //contact.ItemProperties.Add(ThisAddIn.DotTelDomainContactField, Microsoft.Office.Interop.Outlook.OlUserPropertyType.olText, true, Type.Missing);
888                //contact.Save();
889            }
890            return telname.ToLower();
891        }
892
893        /// <summary>
894        /// Saves the telname to the contact
895        /// </summary>
896        /// <param name="telname"></param>
897        private void SetTelname(string telname)
898        {
899            Logger.Log(Logger.Section.Contact_Toolbar, "SetTelname called with " + telname);
900            if (telname.Length == 0)
901            {
902                Logger.Log(Logger.Section.Contact_Toolbar, "Setting blank telname");
903                try
904                {
905                    Outlook.ItemProperty p = contact.ItemProperties[ThisAddIn.DotTelDomainContactField];
906                    if (telname != (string)p.Value)
907                    {
908                        contact.ItemProperties[ThisAddIn.DotTelDomainContactField].Value = "";
909                        contact.Save();
910                    }
911                }
912                catch (Exception e)
913                {
914                    Logger.Log(Logger.Section.Contact_Toolbar, "Exception setting blank telname: " + e.Message);
915                    //We might not mind this as blank === empty
916                }
917            }
918            else if (!(TelnameChecker.IsValid(telname) || TelnameChecker.IsEnum(telname)))
919            {
920                Logger.Log(Logger.Section.Contact_Toolbar, "Invalid domain: " + telname + " - not saving");
921                return;
922            }
923            else
924            {   // check to see if the telname property already exists for this contact
925                /* - now check whether value has changed
926                 * if (contact.ItemProperties[ThisAddIn.DotTelDomainContactField].Name != ThisAddIn.DotTelDomainContactField)
927                {
928                    // add the property
929                    contact.ItemProperties.Add(ThisAddIn.DotTelDomainContactField, Microsoft.Office.Interop.Outlook.OlUserPropertyType.olText, true, Type.Missing);
930                    contact.Save();
931                }*/
932
933                try
934                {
935                    Outlook.ItemProperty p = contact.ItemProperties[ThisAddIn.DotTelDomainContactField];
936                    if (telname != (string)p.Value) //check a change is occurring
937                    {
938                        contact.ItemProperties[ThisAddIn.DotTelDomainContactField].Value = telname;
939                        contact.Save();
940                    }
941                }
942                catch (Exception)
943                {
944                    // property doesn't exist yet. Lets add it
945                    contact.ItemProperties.Add(ThisAddIn.DotTelDomainContactField, Microsoft.Office.Interop.Outlook.OlUserPropertyType.olText, true, Type.Missing);
946                    contact.ItemProperties[ThisAddIn.DotTelDomainContactField].Value = telname;
947                    contact.Save();
948                }
949            }
950        }
951    }
952}
Note: See TracBrowser for help on using the browser.
Telnic
Search This Site
Partners
Neustar
ICANN
Main site | WHOIS | Sell .tel | FAQ | Archived Site | About Telnic | Contact Us