Пример #1
0
        private void PostButton_Click(object sender, EventArgs e)
        {
            if (StatusText.Text.Trim().Length == 0)
            {
                if (!ImageSelectionPanel.Enabled)
                {
                    DoRefresh();
                    return;
                }
            }

            if (this.ExistCurrentPost && StatusText.Text.Trim() == string.Format("RT @{0}: {1}", _curPost.ScreenName, _curPost.TextFromApi))
            {
                DialogResult rtResult = MessageBox.Show(string.Format(Properties.Resources.PostButton_Click1, Environment.NewLine),
                                                               "Retweet",
                                                               MessageBoxButtons.YesNoCancel,
                                                               MessageBoxIcon.Question);
                switch (rtResult)
                {
                    case DialogResult.Yes:
                        doReTweetOfficial(false);
                        StatusText.Text = "";
                        return;
                    case DialogResult.Cancel:
                        return;
                }
            }

            _history[_history.Count - 1] = new PostingStatus(StatusText.Text.Trim(), _reply_to_id, _reply_to_name);

            if (SettingDialog.Nicoms)
            {
                StatusText.SelectionStart = StatusText.Text.Length;
                UrlConvert(MyCommon.UrlConverter.Nicoms);
            }
            //if (SettingDialog.UrlConvertAuto)
            //{
            //    StatusText.SelectionStart = StatusText.Text.Length;
            //    UrlConvertAutoToolStripMenuItem_Click(null, null);
            //}
            //else if (SettingDialog.Nicoms)
            //{
            //    StatusText.SelectionStart = StatusText.Text.Length;
            //    UrlConvert(UrlConverter.Nicoms);
            //}
            StatusText.SelectionStart = StatusText.Text.Length;
            GetWorkerArg args = new GetWorkerArg();
            args.page = 0;
            args.endPage = 0;
            args.type = MyCommon.WORKERTYPE.PostMessage;
            CheckReplyTo(StatusText.Text);

            //整形によって増加する文字数を取得
            int adjustCount = 0;
            string tmpStatus = StatusText.Text.Trim();
            if (ToolStripMenuItemApiCommandEvasion.Checked)
            {
                // APIコマンド回避
                if (Regex.IsMatch(tmpStatus,
                    @"^[+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]*(get|g|fav|follow|f|on|off|stop|quit|leave|l|whois|w|nudge|n|stats|invite|track|untrack|tracks|tracking|\*)([+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]+|$)",
                    RegexOptions.IgnoreCase)
                   && tmpStatus.EndsWith(" .") == false) adjustCount += 2;
            }

            if (ToolStripMenuItemUrlMultibyteSplit.Checked)
            {
                // URLと全角文字の切り離し
                adjustCount += Regex.Matches(tmpStatus, @"https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#^]+").Count;
            }

            bool isCutOff = false;
            bool isRemoveFooter = MyCommon.IsKeyDown(Keys.Shift);
            if (StatusText.Multiline && !SettingDialog.PostCtrlEnter)
            {
                //複数行でEnter投稿の場合、Ctrlも押されていたらフッタ付加しない
                isRemoveFooter = MyCommon.IsKeyDown(Keys.Control);
            }
            if (SettingDialog.PostShiftEnter)
            {
                isRemoveFooter = MyCommon.IsKeyDown(Keys.Control);
            }
            if (!isRemoveFooter && (StatusText.Text.Contains("RT @") || StatusText.Text.Contains("QT @")))
            {
                isRemoveFooter = true;
            }
            if (GetRestStatusCount(false, !isRemoveFooter) - adjustCount < 0)
            {
                if (MessageBox.Show(Properties.Resources.PostLengthOverMessage1, Properties.Resources.PostLengthOverMessage2, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
                {
                    isCutOff = true;
                    //if (!SettingDialog.UrlConvertAuto) UrlConvertAutoToolStripMenuItem_Click(null, null);
                    if (GetRestStatusCount(false, !isRemoveFooter) - adjustCount < 0)
                    {
                        isRemoveFooter = true;
                    }
                }
                else
                {
                    return;
                }
            }

            string footer = "";
            string header = "";
            if (StatusText.Text.StartsWith("D ") || StatusText.Text.StartsWith("d "))
            {
                //DM時は何もつけない
                footer = "";
            }
            else
            {
                //ハッシュタグ
                if (HashMgr.IsNotAddToAtReply)
                {
                    if (!string.IsNullOrEmpty(HashMgr.UseHash) && _reply_to_id == 0 && string.IsNullOrEmpty(_reply_to_name))
                    {
                        if (HashMgr.IsHead)
                            header = HashMgr.UseHash + " ";
                        else
                            footer = " " + HashMgr.UseHash;
                    }
                }
                else
                {
                    if (!string.IsNullOrEmpty(HashMgr.UseHash))
                    {
                        if (HashMgr.IsHead)
                            header = HashMgr.UseHash + " ";
                        else
                            footer = " " + HashMgr.UseHash;
                    }
                }
                if (!isRemoveFooter)
                {
                    if (SettingDialog.UseRecommendStatus)
                        // 推奨ステータスを使用する
                        footer += SettingDialog.RecommendStatusText;
                    else
                        // テキストボックスに入力されている文字列を使用する
                        footer += " " + SettingDialog.Status.Trim();
                }
            }
            args.status.status = header + StatusText.Text.Trim() + footer;

            if (ToolStripMenuItemApiCommandEvasion.Checked)
            {
                // APIコマンド回避
                if (Regex.IsMatch(args.status.status,
                    @"^[+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]*(get|g|fav|follow|f|on|off|stop|quit|leave|l|whois|w|nudge|n|stats|invite|track|untrack|tracks|tracking|\*)([+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]+|$)",
                    RegexOptions.IgnoreCase)
                   && args.status.status.EndsWith(" .") == false) args.status.status += " .";
            }

            if (ToolStripMenuItemUrlMultibyteSplit.Checked)
            {
                // URLと全角文字の切り離し
                Match mc2 = Regex.Match(args.status.status, @"https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#^]+");
                if (mc2.Success) args.status.status = Regex.Replace(args.status.status, @"https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#^]+", "$& ");
            }

            if (IdeographicSpaceToSpaceToolStripMenuItem.Checked)
            {
                // 文中の全角スペースを半角スペース1個にする
                args.status.status = args.status.status.Replace(" ", " ");
            }

            if (isCutOff && args.status.status.Length > 140)
            {
                args.status.status = args.status.status.Substring(0, 140);
                string AtId = @"(@|@)[a-z0-9_/]+$";
                string HashTag = @"(^|[^0-9A-Z&\/\?]+)(#|#)([0-9A-Z_]*[A-Z_]+)$";
                string Url = @"https?:\/\/[a-z0-9!\*'\(\);:&=\+\$\/%#\[\]\-_\.,~?]+$"; //簡易判定
                string pattern = string.Format("({0})|({1})|({2})", AtId, HashTag, Url);
                Match mc = Regex.Match(args.status.status, pattern, RegexOptions.IgnoreCase);
                if (mc.Success)
                {
                    //さらに@ID、ハッシュタグ、URLと推測される文字列をカットする
                    args.status.status = args.status.status.Substring(0, 140 - mc.Value.Length);
                }
                if (MessageBox.Show(args.status.status, "Post or Cancel?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel) return;
            }

            args.status.inReplyToId = _reply_to_id;
            args.status.inReplyToName = _reply_to_name;
            if (ImageSelectionPanel.Visible)
            {
                //画像投稿
                if (ImageSelectedPicture.Image != ImageSelectedPicture.InitialImage &&
                    ImageServiceCombo.SelectedIndex > -1 &&
                    !string.IsNullOrEmpty(ImagefilePathText.Text))
                {
                    if (MessageBox.Show(Properties.Resources.PostPictureConfirm1,
                                       Properties.Resources.PostPictureConfirm2,
                                       MessageBoxButtons.OKCancel,
                                       MessageBoxIcon.Question,
                                       MessageBoxDefaultButton.Button1)
                                   == DialogResult.Cancel)
                    {
                        TimelinePanel.Visible = true;
                        TimelinePanel.Enabled = true;
                        ImageSelectionPanel.Visible = false;
                        ImageSelectionPanel.Enabled = false;
                        if (_curList != null)
                            _curList.Focus();
                        return;
                    }
                    args.status.imageService = ImageServiceCombo.Text;
                    args.status.imagePath = ImagefilePathText.Text;
                    ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage;
                    ImagefilePathText.Text = "";
                    TimelinePanel.Visible = true;
                    TimelinePanel.Enabled = true;
                    ImageSelectionPanel.Visible = false;
                    ImageSelectionPanel.Enabled = false;
                    if (_curList != null)
                        _curList.Focus();
                }
                else
                {
                    MessageBox.Show(Properties.Resources.PostPictureWarn1, Properties.Resources.PostPictureWarn2);
                    return;
                }
            }

            RunAsync(args);

            //Google検索(試験実装)
            if (StatusText.Text.StartsWith("Google:", StringComparison.OrdinalIgnoreCase) && StatusText.Text.Trim().Length > 7)
            {
                string tmp = string.Format(Properties.Resources.SearchItem2Url, HttpUtility.UrlEncode(StatusText.Text.Substring(7)));
                OpenUriAsync(tmp);
            }

            _reply_to_id = 0;
            _reply_to_name = "";
            StatusText.Text = "";
            _history.Add(new PostingStatus());
            _hisIdx = _history.Count - 1;
            if (!ToolStripFocusLockMenuItem.Checked)
                ((Control)ListTab.SelectedTab.Tag).Focus();
            urlUndoBuffer = null;
            UrlUndoToolStripMenuItem.Enabled = false;  //Undoをできないように設定
        }
Пример #2
0
 private string MakeStatusMessage(GetWorkerArg AsyncArg, bool Finish)
 {
     string smsg = "";
     if (!Finish)
     {
         //継続中メッセージ
         switch (AsyncArg.type)
         {
             case MyCommon.WORKERTYPE.Timeline:
                 smsg = Properties.Resources.GetTimelineWorker_RunWorkerCompletedText5 + AsyncArg.page.ToString() + Properties.Resources.GetTimelineWorker_RunWorkerCompletedText6;
                 break;
             case MyCommon.WORKERTYPE.Reply:
                 smsg = Properties.Resources.GetTimelineWorker_RunWorkerCompletedText4 + AsyncArg.page.ToString() + Properties.Resources.GetTimelineWorker_RunWorkerCompletedText6;
                 break;
             case MyCommon.WORKERTYPE.DirectMessegeRcv:
                 smsg = Properties.Resources.GetTimelineWorker_RunWorkerCompletedText8 + AsyncArg.page.ToString() + Properties.Resources.GetTimelineWorker_RunWorkerCompletedText6;
                 break;
             case MyCommon.WORKERTYPE.FavAdd:
                 smsg = Properties.Resources.GetTimelineWorker_RunWorkerCompletedText15 + AsyncArg.page.ToString() + "/" + AsyncArg.ids.Count.ToString() +
                                     Properties.Resources.GetTimelineWorker_RunWorkerCompletedText16 + (AsyncArg.page - AsyncArg.sIds.Count - 1).ToString();
                 break;
             case MyCommon.WORKERTYPE.FavRemove:
                 smsg = Properties.Resources.GetTimelineWorker_RunWorkerCompletedText17 + AsyncArg.page.ToString() + "/" + AsyncArg.ids.Count.ToString() +
                                     Properties.Resources.GetTimelineWorker_RunWorkerCompletedText18 + (AsyncArg.page - AsyncArg.sIds.Count - 1).ToString();
                 break;
             case MyCommon.WORKERTYPE.Favorites:
                 smsg = Properties.Resources.GetTimelineWorker_RunWorkerCompletedText19;
                 break;
             case MyCommon.WORKERTYPE.PublicSearch:
                 smsg = "Search refreshing...";
                 break;
             case MyCommon.WORKERTYPE.List:
                 smsg = "List refreshing...";
                 break;
             case MyCommon.WORKERTYPE.Related:
                 smsg = "Related refreshing...";
                 break;
             case MyCommon.WORKERTYPE.UserTimeline:
                 smsg = "UserTimeline refreshing...";
                 break;
         }
     }
     else
     {
         //完了メッセージ
         switch (AsyncArg.type)
         {
             case MyCommon.WORKERTYPE.Timeline:
                 smsg = Properties.Resources.GetTimelineWorker_RunWorkerCompletedText1;
                 break;
             case MyCommon.WORKERTYPE.Reply:
                 smsg = Properties.Resources.GetTimelineWorker_RunWorkerCompletedText9;
                 break;
             case MyCommon.WORKERTYPE.DirectMessegeRcv:
                 smsg = Properties.Resources.GetTimelineWorker_RunWorkerCompletedText11;
                 break;
             case MyCommon.WORKERTYPE.DirectMessegeSnt:
                 smsg = Properties.Resources.GetTimelineWorker_RunWorkerCompletedText13;
                 break;
             case MyCommon.WORKERTYPE.FavAdd:
                 //進捗メッセージ残す
                 break;
             case MyCommon.WORKERTYPE.FavRemove:
                 //進捗メッセージ残す
                 break;
             case MyCommon.WORKERTYPE.Favorites:
                 smsg = Properties.Resources.GetTimelineWorker_RunWorkerCompletedText20;
                 break;
             case MyCommon.WORKERTYPE.Follower:
                 smsg = Properties.Resources.UpdateFollowersMenuItem1_ClickText3;
                 break;
             case MyCommon.WORKERTYPE.Configuration:
                 //進捗メッセージ残す
                 break;
             case MyCommon.WORKERTYPE.PublicSearch:
                 smsg = "Search refreshed";
                 break;
             case MyCommon.WORKERTYPE.List:
                 smsg = "List refreshed";
                 break;
             case MyCommon.WORKERTYPE.Related:
                 smsg = "Related refreshed";
                 break;
             case MyCommon.WORKERTYPE.UserTimeline:
                 smsg = "UserTimeline refreshed";
                 break;
             case MyCommon.WORKERTYPE.BlockIds:
                 smsg = Properties.Resources.UpdateBlockUserText3;
                 break;
         }
     }
     return smsg;
 }
Пример #3
0
        public void OpenUriAsync(string UriString)
        {
            GetWorkerArg args = new GetWorkerArg();
            args.type = MyCommon.WORKERTYPE.OpenUri;
            args.url = UriString;

            RunAsync(args);
        }
Пример #4
0
        private void GetTimeline(MyCommon.WORKERTYPE WkType, int fromPage, int toPage, string tabName)
        {
            if (!this.IsNetworkAvailable()) return;

            //非同期実行引数設定
            GetWorkerArg args = new GetWorkerArg();
            args.page = fromPage;
            args.endPage = toPage;
            args.type = WkType;
            args.tName = tabName;

            if (!lastTime.ContainsKey(WkType)) lastTime.Add(WkType, new DateTime());
            double period = DateTime.Now.Subtract(lastTime[WkType]).TotalSeconds;
            if (period > 1 || period < -1)
            {
                lastTime[WkType] = DateTime.Now;
                RunAsync(args);
            }

            //Timeline取得モードの場合はReplyも同時に取得
            //if (!SettingDialog.UseAPI &&
            //   !_initial &&
            //   WkType == MyCommon.WORKERTYPE.Timeline &&
            //   SettingDialog.CheckReply)
            //{
            //    //TimerReply.Enabled = false;
            //    _mentionCounter = SettingDialog.ReplyPeriodInt;
            //    GetWorkerArg _args = new GetWorkerArg();
            //    _args.page = fromPage;
            //    _args.endPage = toPage;
            //    _args.type = MyCommon.WORKERTYPE.Reply;
            //    RunAsync(_args);
            //}
        }
Пример #5
0
        private void GetTimelineWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (MyCommon._endingFlag || e.Cancelled) return; //キャンセル

            if (e.Error != null)
            {
                _myStatusError = true;
                _waitTimeline = false;
                _waitReply = false;
                _waitDm = false;
                _waitFav = false;
                _waitPubSearch = false;
                _waitUserTimeline = false;
                _waitLists = false;
                throw new Exception("BackgroundWorker Exception", e.Error);
            }

            GetWorkerResult rslt = (GetWorkerResult)e.Result;

            if (rslt.type == MyCommon.WORKERTYPE.OpenUri) return;

            //エラー
            if (rslt.retMsg.Length > 0)
            {
                _myStatusError = true;
                StatusLabel.Text = rslt.retMsg;
            }

            if (rslt.type == MyCommon.WORKERTYPE.ErrorState) return;

            if (rslt.type == MyCommon.WORKERTYPE.FavRemove)
            {
                this.RemovePostFromFavTab(rslt.sIds.ToArray());
            }

            //リストに反映
            //bool busy = false;
            //foreach (BackgroundWorker bw in _bw)
            //{
            //    if (bw != null && bw.IsBusy)
            //    {
            //        busy = true;
            //        break;
            //    }
            //}
            //if (!busy) RefreshTimeline(); //background処理なければ、リスト反映
            if (rslt.type == MyCommon.WORKERTYPE.Timeline ||
                rslt.type == MyCommon.WORKERTYPE.Reply ||
                rslt.type == MyCommon.WORKERTYPE.List ||
                rslt.type == MyCommon.WORKERTYPE.PublicSearch ||
                rslt.type == MyCommon.WORKERTYPE.DirectMessegeRcv ||
                rslt.type == MyCommon.WORKERTYPE.DirectMessegeSnt ||
                rslt.type == MyCommon.WORKERTYPE.Favorites ||
                rslt.type == MyCommon.WORKERTYPE.Follower ||
                rslt.type == MyCommon.WORKERTYPE.FavAdd ||
                rslt.type == MyCommon.WORKERTYPE.FavRemove ||
                rslt.type == MyCommon.WORKERTYPE.Related ||
                rslt.type == MyCommon.WORKERTYPE.UserTimeline ||
                rslt.type == MyCommon.WORKERTYPE.BlockIds ||
                rslt.type == MyCommon.WORKERTYPE.Configuration)
            {
                RefreshTimeline(false); //リスト反映
            }

            switch (rslt.type)
            {
                case MyCommon.WORKERTYPE.Timeline:
                    _waitTimeline = false;
                    if (!_initial)
                    {
                        //    //API使用時の取得調整は別途考える(カウント調整?)
                    }
                    break;
                case MyCommon.WORKERTYPE.Reply:
                    _waitReply = false;
                    if (rslt.newDM && !_initial)
                    {
                        GetTimeline(MyCommon.WORKERTYPE.DirectMessegeRcv, 1, 0, "");
                    }
                    break;
                case MyCommon.WORKERTYPE.Favorites:
                    _waitFav = false;
                    break;
                case MyCommon.WORKERTYPE.DirectMessegeRcv:
                    _waitDm = false;
                    break;
                case MyCommon.WORKERTYPE.FavAdd:
                case MyCommon.WORKERTYPE.FavRemove:
                    if (_curList != null && _curTab != null)
                    {
                        _curList.BeginUpdate();
                        if (rslt.type == MyCommon.WORKERTYPE.FavRemove && _statuses.Tabs[_curTab.Text].TabType == MyCommon.TabUsageType.Favorites)
                        {
                            //色変えは不要
                        }
                        else
                        {
                            for (int i = 0; i <= rslt.sIds.Count - 1; i++)
                            {
                                if (_curTab.Text.Equals(rslt.tName))
                                {
                                    int idx = _statuses.Tabs[rslt.tName].IndexOf(rslt.sIds[i]);
                                    if (idx > -1)
                                    {
                                        PostClass post = null;
                                        TabClass tb = _statuses.Tabs[rslt.tName];
                                        if (tb != null)
                                        {
                                            if (tb.TabType == MyCommon.TabUsageType.Lists || tb.TabType == MyCommon.TabUsageType.PublicSearch)
                                            {
                                                post = tb.Posts[rslt.sIds[i]];
                                            }
                                            else
                                            {
                                                post = _statuses[rslt.sIds[i]];
                                            }
                                            ChangeCacheStyleRead(post.IsRead, idx, _curTab);
                                        }
                                        if (idx == _curItemIndex) DispSelectedPost(true); //選択アイテム再表示
                                    }
                                }
                            }
                        }
                        _curList.EndUpdate();
                    }
                    break;
                case MyCommon.WORKERTYPE.PostMessage:
                    if (string.IsNullOrEmpty(rslt.retMsg) ||
                        rslt.retMsg.StartsWith("Outputz") ||
                        rslt.retMsg.StartsWith("OK:") ||
                        rslt.retMsg == "Warn:Status is a duplicate.")
                    {
                        _postTimestamps.Add(DateTime.Now);
                        DateTime oneHour = DateTime.Now.Subtract(new TimeSpan(1, 0, 0));
                        for (int i = _postTimestamps.Count - 1; i >= 0; i--)
                        {
                            if (_postTimestamps[i].CompareTo(oneHour) < 0)
                            {
                                _postTimestamps.RemoveAt(i);
                            }
                        }

                        if (!HashMgr.IsPermanent && !string.IsNullOrEmpty(HashMgr.UseHash))
                        {
                            HashMgr.ClearHashtag();
                            this.HashStripSplitButton.Text = "#[-]";
                            this.HashToggleMenuItem.Checked = false;
                            this.HashToggleToolStripMenuItem.Checked = false;
                        }
                        SetMainWindowTitle();
                        rslt.retMsg = "";
                    }
                    else
                    {
                        DialogResult retry;
                        try
                        {
                            retry = MessageBox.Show(string.Format("{0}   --->   [ " + rslt.retMsg + " ]" + Environment.NewLine + "\"" + rslt.status.status + "\"" + Environment.NewLine + "{1}",
                                                                Properties.Resources.StatusUpdateFailed1,
                                                                Properties.Resources.StatusUpdateFailed2),
                                                            "Failed to update status",
                                                            MessageBoxButtons.RetryCancel,
                                                            MessageBoxIcon.Question);
                        }
                        catch (Exception)
                        {
                            retry = DialogResult.Abort;
                        }
                        if (retry == DialogResult.Retry)
                        {
                            GetWorkerArg args = new GetWorkerArg();
                            args.page = 0;
                            args.endPage = 0;
                            args.type = MyCommon.WORKERTYPE.PostMessage;
                            args.status = rslt.status;
                            RunAsync(args);
                        }
                        else
                        {
                            if (ToolStripFocusLockMenuItem.Checked)
                            {
                                //連投モードのときだけEnterイベントが起きないので強制的に背景色を戻す
                                StatusText_Enter(StatusText, new EventArgs());
                            }
                        }
                    }
                    if (rslt.retMsg.Length == 0 && SettingDialog.PostAndGet)
                    {
                        if (_isActiveUserstream)
                        {
                            RefreshTimeline(true);
                        }
                        else
                        {
                            GetTimeline(MyCommon.WORKERTYPE.Timeline, 1, 0, "");
                        }
                    }
                    break;
                case MyCommon.WORKERTYPE.Retweet:
                    if (rslt.retMsg.Length == 0)
                    {
                        _postTimestamps.Add(DateTime.Now);
                        DateTime oneHour = DateTime.Now.Subtract(new TimeSpan(1, 0, 0));
                        for (int i = _postTimestamps.Count - 1; i >= 0; i--)
                        {
                            if (_postTimestamps[i].CompareTo(oneHour) < 0)
                            {
                                _postTimestamps.RemoveAt(i);
                            }
                        }
                        if (!_isActiveUserstream && SettingDialog.PostAndGet) GetTimeline(MyCommon.WORKERTYPE.Timeline, 1, 0, "");
                    }
                    break;
                case MyCommon.WORKERTYPE.Follower:
                    //_waitFollower = false;
                    _itemCache = null;
                    _postCache = null;
                    if (_curList != null) _curList.Refresh();
                    break;
                case MyCommon.WORKERTYPE.Configuration:
                    //_waitFollower = false
                    if (SettingDialog.TwitterConfiguration.PhotoSizeLimit != 0)
                    {
                        pictureService["Twitter"].Configuration("MaxUploadFilesize", SettingDialog.TwitterConfiguration.PhotoSizeLimit);
                    }
                    _itemCache = null;
                    _postCache = null;
                    if (_curList != null) _curList.Refresh();
                    break;
                case MyCommon.WORKERTYPE.PublicSearch:
                    _waitPubSearch = false;
                    break;
                case MyCommon.WORKERTYPE.UserTimeline:
                    _waitUserTimeline = false;
                    break;
                case MyCommon.WORKERTYPE.List:
                    _waitLists = false;
                    break;
                case MyCommon.WORKERTYPE.Related:
                    TabClass tab = _statuses.GetTabByType(MyCommon.TabUsageType.Related);
                    if (tab != null && tab.RelationTargetPost != null && tab.Contains(tab.RelationTargetPost.StatusId))
                    {
                        foreach (TabPage tp in ListTab.TabPages)
                        {
                            if (tp.Text == tab.TabName)
                            {
                                ((DetailsListView)tp.Tag).SelectedIndices.Add(tab.IndexOf(tab.RelationTargetPost.StatusId));
                                ((DetailsListView)tp.Tag).Items[tab.IndexOf(tab.RelationTargetPost.StatusId)].Focused = true;
                                break;
                            }
                        }
                    }
                    break;
            }
        }
Пример #6
0
        private void FavoriteChange(bool FavAdd , bool multiFavoriteChangeDialogEnable = true)
        {
            //trueでFavAdd,falseでFavRemove
            if (_statuses.Tabs[_curTab.Text].TabType == MyCommon.TabUsageType.DirectMessage || _curList.SelectedIndices.Count == 0
                || !this.ExistCurrentPost) return;

            //複数fav確認msg
            if (_curList.SelectedIndices.Count > 250 && FavAdd)
            {
                MessageBox.Show(Properties.Resources.FavoriteLimitCountText);
                _DoFavRetweetFlags = false;
                return;
            }
            else if (multiFavoriteChangeDialogEnable && _curList.SelectedIndices.Count > 1)
            {
                if (FavAdd)
                {
                    string QuestionText = Properties.Resources.FavAddToolStripMenuItem_ClickText1;
                    if (_DoFavRetweetFlags) QuestionText = Properties.Resources.FavoriteRetweetQuestionText3;
                    if (MessageBox.Show(QuestionText, Properties.Resources.FavAddToolStripMenuItem_ClickText2,
                                       MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel)
                    {
                        _DoFavRetweetFlags = false;
                        return;
                    }
                }
                else
                {
                    if (MessageBox.Show(Properties.Resources.FavRemoveToolStripMenuItem_ClickText1, Properties.Resources.FavRemoveToolStripMenuItem_ClickText2,
                                    MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel)
                    {
                        return;
                    }
                }
            }

            GetWorkerArg args = new GetWorkerArg();
            args.ids = new List<long>();
            args.sIds = new List<long>();
            args.tName = _curTab.Text;
            if (FavAdd)
            {
                args.type = MyCommon.WORKERTYPE.FavAdd;
            }
            else
            {
                args.type = MyCommon.WORKERTYPE.FavRemove;
            }
            foreach (int idx in _curList.SelectedIndices)
            {
                PostClass post = GetCurTabPost(idx);
                if (FavAdd)
                {
                    if (!post.IsFav) args.ids.Add(post.StatusId);
                }
                else
                {
                    if (post.IsFav) args.ids.Add(post.StatusId);
                }
            }
            if (args.ids.Count == 0)
            {
                if (FavAdd)
                    StatusLabel.Text = Properties.Resources.FavAddToolStripMenuItem_ClickText4;
                else
                    StatusLabel.Text = Properties.Resources.FavRemoveToolStripMenuItem_ClickText4;

                return;
            }

            RunAsync(args);
        }
Пример #7
0
 private void doReTweetOfficial(bool isConfirm)
 {
     //公式RT
     if (this.ExistCurrentPost)
     {
         if (_curPost.IsProtect)
         {
             MessageBox.Show("Protected.");
             _DoFavRetweetFlags = false;
             return;
         }
         if (_curList.SelectedIndices.Count > 15)
         {
             MessageBox.Show(Properties.Resources.RetweetLimitText);
             _DoFavRetweetFlags = false;
             return;
         }
         else if (_curList.SelectedIndices.Count > 1)
         {
             string QuestionText = Properties.Resources.RetweetQuestion2;
             if (_DoFavRetweetFlags) QuestionText = Properties.Resources.FavoriteRetweetQuestionText1;
             switch (MessageBox.Show(QuestionText, "Retweet", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question))
             {
                 case DialogResult.Cancel:
                 case DialogResult.No:
                     _DoFavRetweetFlags = false;
                     return;
             }
         }
         else
         {
             if (_curPost.IsDm || _curPost.IsMe)
             {
                 _DoFavRetweetFlags = false;
                 return;
             }
             if (!SettingDialog.RetweetNoConfirm)
             {
                 string Questiontext = Properties.Resources.RetweetQuestion1;
                 if (_DoFavRetweetFlags) Questiontext = Properties.Resources.FavoritesRetweetQuestionText2;
                 if (isConfirm && MessageBox.Show(Questiontext, "Retweet", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel)
                 {
                     _DoFavRetweetFlags = false;
                     return;
                 }
             }
         }
         GetWorkerArg args = new GetWorkerArg();
         args.ids = new List<long>();
         args.sIds = new List<long>();
         args.tName = _curTab.Text;
         args.type = MyCommon.WORKERTYPE.Retweet;
         foreach (int idx in _curList.SelectedIndices)
         {
             PostClass post = GetCurTabPost(idx);
             if (!post.IsMe && !post.IsProtect && !post.IsDm) args.ids.Add(post.StatusId);
         }
         RunAsync(args);
     }
 }
Пример #8
0
        private void RunAsync(GetWorkerArg args)
        {
            BackgroundWorker bw = null;
            if (args.type != MyCommon.WORKERTYPE.Follower)
            {
                for (int i = 0; i < _bw.Length; i++)
                {
                    if (_bw[i] != null && !_bw[i].IsBusy)
                    {
                        bw = _bw[i];
                        break;
                    }
                }
                if (bw == null)
                {
                    for (int i = 0; i < _bw.Length; i++)
                    {
                        if (_bw[i] == null)
                        {
                            _bw[i] = new BackgroundWorker();
                            bw = _bw[i];
                            bw.WorkerReportsProgress = true;
                            bw.WorkerSupportsCancellation = true;
                            bw.DoWork += GetTimelineWorker_DoWork;
                            bw.ProgressChanged += GetTimelineWorker_ProgressChanged;
                            bw.RunWorkerCompleted += GetTimelineWorker_RunWorkerCompleted;
                            break;
                        }
                    }
                }
            }
            else
            {
                if (_bwFollower == null)
                {
                    _bwFollower = new BackgroundWorker();
                    bw = _bwFollower;
                    bw.WorkerReportsProgress = true;
                    bw.WorkerSupportsCancellation = true;
                    bw.DoWork += GetTimelineWorker_DoWork;
                    bw.ProgressChanged += GetTimelineWorker_ProgressChanged;
                    bw.RunWorkerCompleted += GetTimelineWorker_RunWorkerCompleted;
                }
                else
                {
                    if (_bwFollower.IsBusy == false)
                        bw = _bwFollower;
                }
            }
            if (bw == null) return;

            bw.RunWorkerAsync(args);
        }
Пример #9
0
        private void RunAsync(GetWorkerArg args)
        {
            BackgroundWorker bw = null;
            if (args.WorkerType == WorkerType.Follower)
            {
                if (_followerFetchWorker == null)
                {
                    bw = _followerFetchWorker = CreateTimelineWorker();
                }
                else
                {
                    if (!_followerFetchWorker.IsBusy)
                    {
                        bw = _followerFetchWorker;
                    }
                }
            }
            else
            {
                foreach (var t in _bworkers)
                {
                    if (t != null && !t.IsBusy)
                    {
                        bw = t;
                        break;
                    }
                }

                if (bw == null)
                {
                    for (int i = 0; i < _bworkers.Length; i++)
                    {
                        if (_bworkers[i] == null)
                        {
                            _bworkers[i] = CreateTimelineWorker();
                            bw = _bworkers[i];
                            break;
                        }
                    }
                }
            }

            if (bw == null)
            {
                return;
            }

            bw.RunWorkerAsync(args);
        }
Пример #10
0
        private string MakeStatusMessage(GetWorkerArg asyncArg, bool isFinish)
        {
            string smsg = string.Empty;
            switch (asyncArg.WorkerType)
            {
                case WorkerType.Timeline:
                    smsg = isFinish ?
                        R.GetTimelineWorker_RunWorkerCompletedText1 :
                        string.Format("{0}{1}{2}", R.GetTimelineWorker_RunWorkerCompletedText5, asyncArg.Page, R.GetTimelineWorker_RunWorkerCompletedText6);
                    break;

                case WorkerType.Reply:
                    smsg = isFinish ?
                        R.GetTimelineWorker_RunWorkerCompletedText9 :
                        string.Format("{0}{1}{2}", R.GetTimelineWorker_RunWorkerCompletedText4, asyncArg.Page, R.GetTimelineWorker_RunWorkerCompletedText6);
                    break;

                case WorkerType.DirectMessegeRcv:
                    smsg = isFinish ?
                        R.GetTimelineWorker_RunWorkerCompletedText11 :
                        string.Format("{0}{1}{2}", R.GetTimelineWorker_RunWorkerCompletedText8, asyncArg.Page, R.GetTimelineWorker_RunWorkerCompletedText6);
                    break;

                case WorkerType.FavAdd:

                    // 進捗メッセージ残す
                    smsg = isFinish ?
                        string.Empty :
                        string.Format("{0}{1}/{2}{3}{4}", R.GetTimelineWorker_RunWorkerCompletedText15, asyncArg.Page, asyncArg.Ids.Count, R.GetTimelineWorker_RunWorkerCompletedText16, asyncArg.Page - asyncArg.SIds.Count - 1);
                    break;

                case WorkerType.FavRemove:

                    // 進捗メッセージ残す
                    smsg = isFinish ?
                        string.Empty :
                        string.Format("{0}{1}/{2}{3}{4}", R.GetTimelineWorker_RunWorkerCompletedText17, asyncArg.Page, asyncArg.Ids.Count, R.GetTimelineWorker_RunWorkerCompletedText18, asyncArg.Page - asyncArg.SIds.Count - 1);
                    break;

                case WorkerType.Favorites:
                    smsg = isFinish ?
                        R.GetTimelineWorker_RunWorkerCompletedText20 :
                        R.GetTimelineWorker_RunWorkerCompletedText19;
                    break;

                case WorkerType.PublicSearch:
                    smsg = isFinish ?
                        "Search refreshed" :
                        "Search refreshing...";
                    break;

                case WorkerType.List:
                    smsg = isFinish ?
                        "List refreshed" :
                        "List refreshing...";
                    break;

                case WorkerType.Related:
                    smsg = isFinish ?
                        "Related refreshed" :
                        "Related refreshing...";
                    break;

                case WorkerType.UserTimeline:
                    smsg = isFinish ?
                        "UserTimeline refreshed" :
                        "UserTimeline refreshing...";
                    break;

                case WorkerType.Follower:
                    smsg = isFinish ?
                        R.UpdateFollowersMenuItem1_ClickText3 :
                        string.Empty;
                    break;

                case WorkerType.Configuration:

                    // 進捗メッセージ残す
                    break;

                case WorkerType.BlockIds:
                    smsg = isFinish ?
                        R.UpdateBlockUserText3 :
                        string.Empty;
                    break;
            }

            return smsg;
        }