public static void ShowFor(int seconds)
        {
            var handle = new RevitHandle();
            var dlg = new About();
            handle.SetAsOwnerTo(dlg);

            dlg.Show();
            Thread.Sleep(seconds * 1000);
            dlg.Close();
        }
        public Result Execute(ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements)
        {
            #if !DEBUG
            //show about information if this is the first time when the tool is used
            if (AddInApplication.Used == 0)
                About.ShowFor(3);
            AddInApplication.Used++;
            #endif

            //show UI
            var dlg = new SearchDialog();
            var handle = new RevitHandle();
            handle.SetAsOwnerTo(dlg);

            if (dlg.ShowDialog() != true) return Result.Cancelled;

            //get search string
            var searchString = dlg.SearchText;

            //create proxy client for a BIM Library services
            var client = new BimLibraryService.BIMserviceClient(new BasicHttpBinding(BasicHttpSecurityMode.None),
                new EndpointAddress(Paths.BimServiceEndpoint));

            //many exceptions may occure during service operation
            try
            {
                client.Open();
                //search for a Revit products
                var products = client.GetProductByName(searchString);

                if (products.Length == 0)
                {
                    TaskDialog.Show("Produkt nenalezen", "Nebyl nalezen žádný produkt odpovídající zadání.");
                    //call this again to try is again;
                    return Execute(commandData, ref message, elements);
                }

                //show result in a dialog where user can download the object into his project
                var resultsDlg = new SearchResultsDialog();
                handle.SetAsOwnerTo(resultsDlg);
                resultsDlg.Products = products.Select(p => new ProductViewModel(p));
                resultsDlg.ShowDialog();

            }
            catch (FaultException customFaultEx)
            {
                return FailGracefully(customFaultEx.Message);
            }
            // The following is typically thrown on the client when a channel is terminated due to the server closing the connection.
            catch (ChannelTerminatedException cte)
            {
                return FailGracefully(cte.Message);
            }
            // The following is thrown when a remote endpoint could not be found or reached.  The endpoint may not be found or
            // reachable because the remote endpoint is down, the remote endpoint is unreachable, or because the remote network is unreachable.
            catch (EndpointNotFoundException enfe)
            {
                return FailGracefully(enfe.Message);
            }
            // The following exception that is thrown when a server is too busy to accept a message.
            catch (ServerTooBusyException stbe)
            {
                return FailGracefully(stbe.Message);
            }
            catch (TimeoutException timeoutEx)
            {
                return FailGracefully(timeoutEx.Message);
            }
            catch (CommunicationException comException)
            {
                return FailGracefully(comException.Message);
            }
            catch (Exception e)
            {
                // rethrow any other exception not defined here
                throw e;
            }

            return Result.Succeeded;
        }