Grupuje dane z modelu do wyświetlenia w widoku
예제 #1
0
        public void AddStatus(StatusViewModel statusView, bool insertAtBeginning)
        {
            Dispatcher.Invoke(
                new Action<StatusViewModel>(
                    delegate(StatusViewModel status)
                    {

                        var currentList = lstbStatusList.ItemsSource as IList<StatusViewModel>;
                        //currentList.Insert(0, status);

                        if(insertAtBeginning)
                        {
                            currentList.Insert(0, status);
                        }
                        else
                        {

                        currentList.Add(status);
                        }
                        //todo:to tak testowo
                        FlashMainWindow(Window.GetWindow(this.Parent), true);
                    }), statusView);
        }
예제 #2
0
        /// <summary>
        /// Dodaje status do listy w widoku
        /// </summary>
        /// <param name="statusView">status</param>
        /// <param name="insertAtBeginning">czy dodać na początek czy na koniec listy</param>
        public void AddStatus(StatusViewModel statusView, bool insertAtBeginning)
        {
            Dispatcher.Invoke(
                new Action<StatusViewModel>(
                    delegate(StatusViewModel status)
                        {
                            var currentList = lstbStatusList.ItemsSource as IList<StatusViewModel>;
                            //currentList.Insert(0, status);

                            //jeśli zawiera już ten status to
                            //go nie dodajemy ponownie, czasami pobierze podwójnie
                            //ten sam wpis
                            //if(currentList.Contains(status))
                            //{
                            //    return;
                            //}

                            if (currentList != null)
                            {
                                if (insertAtBeginning)
                                {
                                    currentList.Insert(0, status);
                                }
                                else
                                {
                                    currentList.Add(status);
                                }
                            }
                            //todo:testowo zmiana ikony w tray'u
                            Window parentWindows = Window.GetWindow(Parent);
                            if (parentWindows is HostWindow)
                            {
                                ((HostWindow) parentWindows).StatusAdded();
                            }

                            //todo:to tak testowo
                            FlashMainWindow(Window.GetWindow(Parent), true);
                        }), statusView);
        }
예제 #3
0
        /// <summary>
        /// tworzy początek wiadomości, który zaczyna się od loginu(loginów) użytkownika
        /// </summary>
        /// <param name="mainTextBlock"></param>
        /// <param name="s"></param>
        private static void CreateUsersBegining(StatusBindableTextBlock mainTextBlock, StatusViewModel s)
        {
            Hyperlink hypUserLogin = CreateUserHyperLink(s.UserLogin, string.Format(userLinkFormat, s.UserLogin),
                                                         string.Format(userProfileFormat, s.UserLogin), mainTextBlock);

            //dodajemy link użytkownka
            mainTextBlock.Inlines.Add(hypUserLogin);

            //tworzymy link odbiorcy wiadomośći
            if ((s.StatusType == "DirectedMessage") || (s.StatusType == "PrivateMessage"))
            {
                string mark = (s.StatusType == "DirectedMessage") ? " > " : " >> ";
                //Run r = CreateRun(mark);

                mainTextBlock.Inlines.Add(mark);

                //tworzymy link użytkownika odbiorcy wiadomości
                Hyperlink hypRecipientLogin = CreateUserHyperLink(s.RecipientLogin,
                                                                  string.Format(userLinkFormat, s.RecipientLogin),
                                                                  string.Format(userProfileFormat, s.RecipientLogin),
                                                                  mainTextBlock);
                //dodajemy link użytkownka
                mainTextBlock.Inlines.Add(hypRecipientLogin);
            }

            //Run rr = CreateRun(": ");
            mainTextBlock.Inlines.Add(": ");
        }
예제 #4
0
        /// <summary>
        /// Pomocna metoda do mapowania Entities do ViewEntities
        /// </summary>
        /// <param name="iList"></param>
        /// <returns></returns>
        public static StatusViewModel MapToViewStatus(BlipFace.Service.Entities.BlipStatus status)
        {
            StatusViewModel st = new StatusViewModel();
            try
            {
                //todo: trzeba uważać bo gdy nie ma recipient to
                //rzuca wyjątekiem nullreference
                string reciptientAvatar = string.Empty;
                string reciptientLogin = string.Empty;

                //czasami data nie jest ustawiana przez Blipa - dziwne
                string creationDate = string.Empty;
                string avatarUrl = status.User.Avatar == null
                                       ? "http://static1.blip.pl/images/nn_nano.png?1240395130"
                                       : status.User.Avatar.Url50;

                st.StatusId = status.Id;
                st.UserId = status.User.Id;
                st.Content = status.Content;
                st.UserAvatar50 = avatarUrl;
                st.RecipientAvatar50 = reciptientAvatar;
                st.RecipientLogin = reciptientLogin;
                st.CreationDate = creationDate;
                st.UserLogin = status.User.Login;
            }
            catch (Exception e)
            {
                throw;
            }

            return st;
        }
예제 #5
0
        /// <summary>
        /// Callback do zdarzenia gdy statusy zostają zaktualizowane
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void BlpComStatusesUpdated(object sender, StatusesLoadingEventArgs e)
        {
            IList<StatusViewModel> sts = ViewModelHelper.MapToViewStatus(e.Statuses, blipfaceUser.UserName);

            lock (lockLastStatus)
            {
                //pierwszy status jest najnowszy
                if(sts.Count>0)
                    newestStatus = sts[0];
            }

            //RetriveBlipHyperlinks(sts);
            //blokujemy kolejką gdy dodajemy do niej nowe statusy,
            lock (lockQueue)
            {
                //dodajemy statusy od końca
                for (int i = sts.Count - 1; i >= 0; i--)
                {
                    statusQueue.Enqueue(sts[i]);
                }

                //foreach (var st in sts)
                //{
                //    statusQueue.Enqueue(st);
                //}
            }

            //pobierz z kolejki dodane wyżej statusu i przetworz je
            AddStatusesWithHyperlinks(true);

            //foreach (var st in sts)
            //{
            //    RetriveStatusHyperlinks(st);
            //}
            //view.UpdateStatuses(sts);

            //view.Statuses = statuses.Concat(view.Statuses).ToList();

            view.ConnectivityStatus = SetConnectivityStatus(ConnectivityStatus.Online);
            // view.Statuses.Insert(0, statuses[0]);

            updateStatusTimer.Start();
        }
예제 #6
0
        private void RetriveStatusHyperlinks(StatusViewModel status)
        {
            var linkMatches = linkRegex.Matches(status.Content);

            if (linkMatches.Count > 0)
            {

                for (int i = 0; i < linkMatches.Count; i++)
                {
                    var url = linkMatches[i].Value;

                    int index = url.LastIndexOf("/");
                    int indexOfHash = url.IndexOf("#", index);

                    //code to co mamy na końcu linka albo w rdir.pl/code lub blip.pl/s/code
                    string code;
                    if (indexOfHash > index)
                    {
                        int len = indexOfHash - 1 - index;
                        code = url.Substring(index + 1, len);
                    }
                    else
                    {
                        code = url.Substring(index + 1);
                    }

                    if (url.Contains("blip.pl"))
                    {
                        //gdy mamy do czynienia z blipnięciem cytowaniem

                        //http://blip.pl/s/11552391
                        BlipStatus blpStat = blpCom.GetUpdate(code);
                        if (blpStat != null)
                        {
                            if (status.Cites == null)
                            {
                                status.Cites = new Dictionary<string, string>();
                            }

                            string blipContent = blpStat.User.Login + ": " + blpStat.Content;
                            status.Cites.Add(url, blipContent);
                        }

                    }
                    else if (url.Contains("rdir.pl"))
                    {

                        string originalLink = blpCom.GetShortLink(code);
                        if (!string.IsNullOrEmpty(originalLink))
                        {
                            //url skrócony
                            if (status.Links == null)
                            {
                                status.Links = new Dictionary<string, string>();
                            }
                            status.Links.Add(url, originalLink);
                        }

                    }
                    else
                    {
                        if (status.Links == null)
                        {
                            status.Links = new Dictionary<string, string>();
                        }
                        //url nie skrócony np. do youtube.com
                        status.Links.Add(url, url);
                    }
                }
            }
        }
예제 #7
0
        /// <summary>
        /// calback do zdarzenia gdy statusy zostają załadowane od nowa
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void BlpComStatusesLoaded(object sender, StatusesLoadingEventArgs e)
        {
            //view.Statuses =

            IList<StatusViewModel> sts = ViewModelHelper.MapToViewStatus(e.Statuses, blipfaceUser.UserName);
            lock (lockLastStatus)
            {
                //pierwszy status jest najnowszy
                if (sts.Count > 0)
                {
                    newestStatus = sts[0];

                    //informacja że załadowano statusy
                    statusesLoaded = true;
                }
            }

            lock (lockQueue)
            {
                //tu nie musimy odwracać bo i tak dodajemy na koniec statusy
                //dodajemy do kolejki od razu, lecz od drugiego statusu dopiero, pierwszy o indeksie 0
                //w celu złudzenia przyspieszenia dodajemy od razu

                for (int i = 1; i < sts.Count; i++)
                {
                    statusQueue.Enqueue(sts[i]);
                }

                //foreach (var st in sts)
                //{
                //    statusQueue.Enqueue(st);
                //}
            }
            //jak najszybciej ustawiamy pierwszy status na liście, aby użytkownik nie czekał
            //aż zostaną przetworzone wszystkie statusy
            var oneStatusList = new ObservableCollection<StatusViewModel>();
            StatusViewModel initStatus = sts[0];
            RetriveStatusHyperlinks(initStatus);
            oneStatusList.Add(initStatus);

            //inicjujemy listę statusów tylko jednym statusem, pozostałe będą dodawanie
            //kolejno
            view.Statuses = oneStatusList;

            //chyba to już nie potrzebne będzie
            //sts.RemoveAt(0);

            //parametr false - dodajemy na koniec statusy
            AddStatusesWithHyperlinks(false);

            //view.Statuses = new List<StatusViewModel>(sts);
            view.ConnectivityStatus = SetConnectivityStatus(ConnectivityStatus.Online);

            //uruchamiamy z normalnym czasem timer
            StartListeningForUpdates(UpdateTime);
        }
예제 #8
0
        /// <summary>
        /// Konstruje format wiadomość prywatnej
        /// </summary>
        /// <param name="status">status na któego użytkownik chce odpowiedzieć prywatnie</param>
        /// <param name="messageText">dotychczasowa treść wiadomości</param>
        public void MakePrivateMessage(StatusViewModel status, string messageText)
        {
            string userFormat = string.Format(">>{0}:", status.UserLogin);

            //uwaga to wyrażenie łapie dwa typy tekstu
            // z jednym znakiem >
            //oraz z dwoma znakami >>
            //dlatego dobrze działa i zamienia gdy drugi raz klikniemy wiadomość prywatna
            //a dotychczasowa wiadomość jest już prywatna
            Regex regex = new Regex(@"^>.*?:");

            string blipMessage;
            if (regex.IsMatch(messageText))
            {
                blipMessage = regex.Replace(messageText, userFormat);
            }
            else
            {
                blipMessage = messageText.Insert(0, userFormat);
            }

            //string blipMessage = Regex.Replace(messageText, @"^>.*:", userFormat, RegexOptions.IgnoreCase);

            view.TextMessage = blipMessage;
        }
예제 #9
0
        /// <summary>
        /// Konstruje format wiadomości skierowanej
        /// </summary>
        /// <param name="status">cały satus na którego użytkownik chce odpowiedzieć</param>
        /// <param name="messageText">dotychczasowa treść wiadomości</param>
        public void MakeDirectMessage(StatusViewModel status, string messageText)
        {
            //format wiadomości dla zwykłej odpowiedzia
            string userFormat = string.Format(">{0}:", status.UserLogin);

            //regex wyszukujące czy wiadomość nie rozpoczyna się jak prywatana
            Regex regexPrivateMessage = new Regex(@"^>>.*?:");

            //regex wyszukujące czy wiadomośc nie rozpoczyna się jak skierowana
            Regex regexDirectMessage = new Regex(@"^>.*:?");

            string blipMessage;
            if (regexPrivateMessage.IsMatch(messageText))
            {
                //jesli rozpoczyna się jak prywatna to zamień na kierowaną
                blipMessage = regexPrivateMessage.Replace(messageText, userFormat);
            }
            else if (regexDirectMessage.IsMatch(messageText))
            {
                //jeśli ropoczyna się jak kierowana to zamień z powrotem na kierowaną
                //może się wydawać bez sensu, lecz przydaje się gdy bedziemy chcieli
                //wysłać do innej osoby niż jest już ustawione
                blipMessage = regexDirectMessage.Replace(messageText, userFormat);
            }
            else
            {
                //jeżeli nie jest do nikogo to wstaw na początek
                blipMessage = messageText.Insert(0, userFormat);
            }

            //string blipMessage = Regex.Replace(messageText, @"^>.*:", userFormat, RegexOptions.IgnoreCase);

            view.TextMessage = blipMessage;
            //string userFormat = string.Format(">{0}: ", status.UserLogin);
            //string blipMessage = Regex.Replace(messageText, @"^>>.*:", userFormat, RegexOptions.IgnoreCase);

            //view.TextMessage = blipMessage;
        }
예제 #10
0
        /// <summary>
        /// Tworzy treść wiadomości do cytowania
        /// </summary>
        /// <param name="status"></param>
        /// <param name="text"></param>
        /// <param name="position"></param>
        public void MakeCitation(StatusViewModel status, string text, int position)
        {
            StringBuilder blipLink = new StringBuilder("http://blip.pl", 26);

            if (status.Type == "DirectedMessage")
            {
                blipLink.Append("/dm/");
            }
            else
            {
                blipLink.Append("/s/");
            }
            blipLink.Append(status.StatusId);

            view.TextMessage = text.Insert(position, blipLink.ToString());
        }
예제 #11
0
        /// <summary>
        /// Konstruje format wiadomość prywatnej
        /// </summary>
        /// <param name="status">status na któego użytkownik chce odpowiedzieć prywatnie</param>
        /// <param name="messageText">dotychczasowa treść wiadomości</param>
        public void MakePrivateMessage(StatusViewModel status, string messageText)
        {
            //todo: do zasobów przenieść
            string userFormat = string.Format(">>{0}:", status.UserLogin);

            //uwaga to wyrażenie łapie dwa typy tekstu
            // z jednym znakiem >
            //oraz z dwoma znakami >>
            //dlatego dobrze działa i zamienia gdy drugi raz klikniemy wiadomość prywatna
            //a dotychczasowa wiadomość jest już prywatna
            string blipMessage;
            if (BlipRegExp.DirectStart.IsMatch(messageText))
            {
                blipMessage = BlipRegExp.DirectStart.Replace(messageText, userFormat);
            }
            else
            {
                blipMessage = messageText.Insert(0, userFormat);
            }

            view.TextMessage = blipMessage;
        }