4242package com .junichi11 .netbeans .modules .github .issues .issue ;
4343
4444import com .junichi11 .netbeans .modules .github .issues .GitHubIssues ;
45+ import com .junichi11 .netbeans .modules .github .issues .issue .ui .CommentTabbedPanel ;
46+ import com .junichi11 .netbeans .modules .github .issues .issue .ui .CommentsPanel ;
4547import com .junichi11 .netbeans .modules .github .issues .issue .ui .GitHubIssuePanel ;
48+ import com .junichi11 .netbeans .modules .github .issues .repository .GitHubRepository ;
4649import com .junichi11 .netbeans .modules .github .issues .utils .StringUtils ;
4750import com .junichi11 .netbeans .modules .github .issues .utils .UiUtils ;
4851import java .awt .event .ActionEvent ;
4952import java .awt .event .ActionListener ;
53+ import java .beans .PropertyChangeEvent ;
5054import java .beans .PropertyChangeListener ;
5155import javax .swing .JComponent ;
5256import javax .swing .SwingUtilities ;
6670 *
6771 * @author junichi11
6872 */
69- public class GitHubIssueController implements IssueController , ChangeListener {
73+ public class GitHubIssueController implements IssueController , ChangeListener , PropertyChangeListener {
7074
7175 private GitHubIssuePanel panel ;
7276 private String errorMessage ;
@@ -126,6 +130,7 @@ private GitHubIssuePanel getPanel() {
126130 panel .addAction (getSubmitIssueAction ());
127131 panel .addAction (getCommentAction ());
128132 panel .addAction (getCloseReopenAction ());
133+ panel .addCommentsChangeListener (this );
129134 }
130135 return panel ;
131136 }
@@ -172,6 +177,91 @@ private CloseReopenAction getCloseReopenAction() {
172177 return new CloseReopenAction ();
173178 }
174179
180+ @ Override
181+ public void propertyChange (PropertyChangeEvent evt ) {
182+ switch (evt .getPropertyName ()) {
183+ case CommentsPanel .PROP_COMMENT_QUOTE :
184+ GitHubIssuePanel p = getPanel ();
185+ String quoteComment = StringUtils .toQuoteComment (p .getQuoteComment ()) + "\n " ; // NOI18N
186+ p .appendNewComment (quoteComment );
187+ break ;
188+ case CommentsPanel .PROP_COMMENT_EDITED :
189+ editComment ();
190+ break ;
191+ case CommentsPanel .PROP_COMMENT_DELETED :
192+ deleteComment ();
193+ break ;
194+ default :
195+ break ;
196+ }
197+ }
198+
199+ @ NbBundle .Messages ({
200+ "GitHubIssueController.edit.comment.title=Edit Comment" ,
201+ "GitHubIssueController.edit.comment.fail=Can't edit this comment."
202+ })
203+ private void editComment () {
204+ final Comment comment = getPanel ().getEditedComment ();
205+ final String editedBody = CommentTabbedPanel .showDialog (Bundle .GitHubIssueController_edit_comment_title (), comment .getBody ());
206+ if (editedBody != null ) {
207+ final GitHubIssue issue = getPanel ().getIssue ();
208+ if (issue != null ) {
209+ RequestProcessor rp = GitHubIssues .getInstance ().getRequestProcessor ();
210+ rp .post (new Runnable () {
211+
212+ @ Override
213+ public void run () {
214+ Comment editedComment = issue .editComment (comment , editedBody );
215+ if (editedComment == null ) {
216+ UiUtils .showErrorDialog (Bundle .GitHubIssueController_edit_comment_fail ());
217+ return ;
218+ }
219+ SwingUtilities .invokeLater (new Runnable () {
220+
221+ @ Override
222+ public void run () {
223+ getPanel ().loadComments ();
224+ }
225+ });
226+ }
227+ });
228+ }
229+ }
230+ }
231+
232+ @ NbBundle .Messages ({
233+ "GitHubIssueController.delete.comment.fail=Can't delete this issue."
234+ })
235+ private void deleteComment () {
236+ final Comment deletedComment = getPanel ().getDeletedComment ();
237+ if (deletedComment == null ) {
238+ return ;
239+ }
240+ RequestProcessor rp = GitHubIssues .getInstance ().getRequestProcessor ();
241+ rp .post (new Runnable () {
242+
243+ @ Override
244+ public void run () {
245+ GitHubRepository repository = getPanel ().getIssue ().getRepository ();
246+ final boolean success = GitHubIssueSupport .deleteComment (repository , deletedComment );
247+
248+ SwingUtilities .invokeLater (new Runnable () {
249+
250+ @ Override
251+ public void run () {
252+ if (success ) {
253+ // remove comment panel
254+ getPanel ().removeDeletedComment ();
255+ } else {
256+ // show error message
257+ UiUtils .showErrorDialog (Bundle .GitHubIssueController_delete_comment_fail ());
258+ }
259+ }
260+ });
261+ }
262+ });
263+ }
264+
175265 //~ inner classes
176266 public class SubmitIssueAction implements ActionListener {
177267
@@ -195,7 +285,7 @@ public void run() {
195285 @ Override
196286 public void run () {
197287 GitHubIssue issue = p .getIssue ();
198- CreateIssueParams issueParams = getCreateIssueParams (p );
288+ CreateIssueParams issueParams = getCreateIssueParams (issue . isNew (), p );
199289 if (issue .isNew ()) {
200290 // add issue
201291 Issue newIssue = issue .submitNewIssue (issueParams );
@@ -223,9 +313,9 @@ public void run() {
223313
224314 }
225315
226- private CreateIssueParams getCreateIssueParams (GitHubIssuePanel p ) {
316+ private CreateIssueParams getCreateIssueParams (boolean isNew , GitHubIssuePanel p ) {
227317 User assignee = p .getAssignee ();
228- if (assignee == null ) {
318+ if (! isNew && assignee == null ) {
229319 assignee = new User ();
230320 assignee .setLogin ("" ); // NOI18N
231321 }
@@ -236,8 +326,10 @@ private CreateIssueParams getCreateIssueParams(GitHubIssuePanel p) {
236326 CreateIssueParams createIssueParams = new CreateIssueParams (p .getTitle ())
237327 .body (p .getDescription ())
238328 .milestone (milestone )
239- .labels (p .getLabels ())
240- .assignee (assignee );
329+ .labels (p .getLabels ());
330+ if (assignee != null ) {
331+ createIssueParams = createIssueParams .assignee (assignee );
332+ }
241333 return createIssueParams ;
242334 }
243335 }
0 commit comments