4242package com .junichi11 .netbeans .modules .github .issues .issue ;
4343
4444import com .junichi11 .netbeans .modules .github .issues .GitHubIssueState ;
45- import com .junichi11 .netbeans .modules .github .issues .GitHubIssuesConfig ;
45+ import com .junichi11 .netbeans .modules .github .issues .GitHubIssues ;
4646import com .junichi11 .netbeans .modules .github .issues .repository .GitHubRepository ;
47+ import com .junichi11 .netbeans .modules .github .issues .utils .DateUtils ;
48+ import com .junichi11 .netbeans .modules .github .issues .utils .UiUtils ;
4749import java .beans .PropertyChangeListener ;
4850import java .beans .PropertyChangeSupport ;
4951import java .io .File ;
50- import java .util .Calendar ;
5152import java .util .Collection ;
5253import java .util .Collections ;
5354import java .util .Date ;
5859import javax .swing .JTable ;
5960import org .eclipse .egit .github .core .Comment ;
6061import org .eclipse .egit .github .core .Issue ;
62+ import org .eclipse .egit .github .core .Milestone ;
6163import org .eclipse .egit .github .core .User ;
6264import org .netbeans .modules .bugtracking .commons .UIUtils ;
6365import org .netbeans .modules .bugtracking .issuetable .ColumnDescriptor ;
6870import org .netbeans .modules .bugtracking .spi .IssueScheduleProvider ;
6971import org .netbeans .modules .bugtracking .spi .IssueStatusProvider ;
7072import org .openide .util .NbBundle ;
71- import org .pegdown .Extensions ;
7273import org .pegdown .PegDownProcessor ;
7374
7475/**
@@ -119,11 +120,50 @@ public String getDisplayName() {
119120 if (isNew ()) {
120121 return Bundle .GitHubIssue_new_issue_displayName ();
121122 }
122- return String .format ("%s - %s" , issue .getNumber (), issue .getTitle ());
123+ return String .format ("%s - %s" , issue .getNumber (), issue .getTitle ()); // NOI18N
123124 }
124125
126+ @ NbBundle .Messages ({
127+ "GitHubIssue.LBL.assignee=Assignee" ,
128+ "GitHubIssue.LBL.created=Created" ,
129+ "GitHubIssue.LBL.createdBy=Created by" ,
130+ "GitHubIssue.LBL.dueDate=Due date" ,
131+ "GitHubIssue.LBL.milestone=Milestone"
132+ })
125133 public String getTooltip () {
126- return String .format ("%s [%s/%s]" , getDisplayName (), repository .getRepositoryAuthor (), repository .getRepositoryName ()); // NOI18N
134+ // XXX improve
135+ StringBuilder sb = new StringBuilder ();
136+ String title = String .format ("%s [%s]" , getDisplayName (), repository .getFullName ()); // NOI18N
137+ sb .append ("<html>" ); // NOI18N
138+ sb .append ("<b>" ).append (title ).append ("</b>" ); // NOI18N
139+ sb .append ("<hr>" ); // NOI18N
140+ Date created = getCreated ();
141+ Date dueDate = getDueDate ();
142+ User assignee = getAssignee ();
143+ User createdUser = getCreatedUser ();
144+ Milestone milestone = getMilestone ();
145+ if (created != null ) {
146+ sb .append (Bundle .GitHubIssue_LBL_created ()).append (" : " ) // NOI18N
147+ .append (DateUtils .DEFAULT_DATE_FORMAT .format (created )).append ("<br>" ); // NOI18N
148+ }
149+ if (dueDate != null ) {
150+ sb .append (Bundle .GitHubIssue_LBL_dueDate ()).append (" : " ) // NOI18N
151+ .append (DateUtils .DEFAULT_DATE_FORMAT .format (dueDate )).append ("<br>" ); // NOI18N
152+ }
153+ if (createdUser != null ) {
154+ sb .append (Bundle .GitHubIssue_LBL_createdBy ()).append (" : " ) // NOI18N
155+ .append (createdUser .getLogin ()).append ("<br>" ); // NOI18N
156+ }
157+ if (assignee != null ) {
158+ sb .append (Bundle .GitHubIssue_LBL_assignee ()).append (" : " ) // NOI18N
159+ .append (assignee .getLogin ()).append ("<br>" ); // NOI18N
160+ }
161+ if (milestone != null ) {
162+ sb .append (Bundle .GitHubIssue_LBL_milestone ()).append (" : " ) // NOI18N
163+ .append (milestone .getTitle ()).append ("<br>" ); // NOI18N
164+ }
165+ sb .append ("</html>" ); // NOI18N
166+ return sb .toString ();
127167 }
128168
129169 public boolean isNew () {
@@ -190,6 +230,13 @@ public Date getClosed() {
190230 return null ;
191231 }
192232
233+ public Milestone getMilestone () {
234+ if (issue != null ) {
235+ return issue .getMilestone ();
236+ }
237+ return null ;
238+ }
239+
193240 public boolean isFinished () {
194241 if (issue == null ) {
195242 return false ;
@@ -237,8 +284,10 @@ public Issue submitNewIssue(CreateIssueParams params) {
237284 setIssue (newIssue );
238285 // add to cache
239286 repository .addIssue (this );
287+ scheduleInfo = createScheduleInfo ();
240288 fireChange ();
241289 fireDataChange ();
290+ fireScheduleChange ();
242291 }
243292 return newIssue ;
244293 }
@@ -247,6 +296,10 @@ public Issue editIssue(CreateIssueParams params) {
247296 Issue editIssue = repository .editIssue (this , params );
248297 if (editIssue != null ) {
249298 setIssue (editIssue );
299+ scheduleInfo = createScheduleInfo ();
300+ fireChange ();
301+ fireDataChange ();
302+ fireScheduleChange ();
250303 } else {
251304 repository .refresh (this );
252305 }
@@ -260,7 +313,7 @@ public Comment editComment(Comment comment, String editedBody) {
260313 comment .setBody (editedBody );
261314 Comment editComment = GitHubIssueSupport .editComment (getRepository (), comment );
262315 if (editComment != null ) {
263- PegDownProcessor processor = new PegDownProcessor ( Extensions . FENCED_CODE_BLOCKS );
316+ PegDownProcessor processor = GitHubIssues . getInstance (). getPegDownProcessor ( );
264317 String body = editComment .getBody ();
265318 String bodyHtml = processor .markdownToHtml (body );
266319 comment .setBodyHtml (String .format ("<html>%s</html>" , bodyHtml )); // NOI18N
@@ -291,49 +344,82 @@ public List<Comment> getComments() {
291344 }
292345
293346 // schedule
347+ @ NbBundle .Messages ({
348+ "GitHubIssue.MSG.setSchedule=Set a due date to your milestone"
349+ })
294350 public void setSchedule (IssueScheduleInfo scheduleInfo ) {
295- this .scheduleInfo = scheduleInfo ;
296- if (scheduleInfo == null ) {
297- // remove schedule
298- GitHubIssuesConfig .getInstance ().removeSchedule (repository , this );
299- } else {
300- GitHubIssuesConfig .getInstance ().setScheduleDueDate (repository , this , scheduleInfo .getDate ());
301- GitHubIssuesConfig .getInstance ().setScheduleInterval (repository , this , scheduleInfo .getInterval ());
302- }
303- fireDataChange ();
304- fireScheduleChange ();
351+ UiUtils .showPlainDialog (Bundle .GitHubIssue_MSG_setSchedule ());
352+ // remove ?
353+ // this.scheduleInfo = scheduleInfo;
354+ // if (scheduleInfo == null) {
355+ // // remove schedule
356+ // GitHubIssuesConfig.getInstance().removeSchedule(repository, this);
357+ // } else {
358+ // GitHubIssuesConfig.getInstance().setScheduleDueDate(repository, this, scheduleInfo.getDate());
359+ // GitHubIssuesConfig.getInstance().setScheduleInterval(repository, this, scheduleInfo.getInterval());
360+ // }
361+ // fireDataChange();
362+ // fireScheduleChange();
305363 }
306364
307365 public Date getDueDate () {
308- IssueScheduleInfo info = getSchedule ();
309- if (info == null ) {
366+ String status = getStatus ();
367+ if (status == null || GitHubIssueState . toEnum ( status ) == GitHubIssueState . CLOSED ) {
310368 return null ;
311369 }
312- Calendar calendar = Calendar .getInstance ();
313- Date date = info .getDate ();
314- int interval = info .getInterval ();
315- if (interval < 1 ) {
316- return null ;
370+ Milestone milestone = getMilestone ();
371+ if (milestone != null ) {
372+ return milestone .getDueOn ();
317373 }
318- calendar .setTime (date );
319- calendar .add (Calendar .DATE , interval );
320- return calendar .getTime ();
374+ return null ;
375+
376+ // remove?
377+ // IssueScheduleInfo info = getSchedule();
378+ // if (info == null) {
379+ // return null;
380+ // }
381+ // Calendar calendar = Calendar.getInstance();
382+ // Date date = info.getDate();
383+ // int interval = info.getInterval();
384+ // if (interval < 1) {
385+ // return null;
386+ // }
387+ // calendar.setTime(date);
388+ // calendar.add(Calendar.DATE, interval);
389+ // return calendar.getTime();
321390 }
322391
323392 public IssueScheduleInfo getSchedule () {
393+ String status = getStatus ();
394+ if (status == null || GitHubIssueState .toEnum (status ) == GitHubIssueState .CLOSED ) {
395+ return null ;
396+ }
324397 if (scheduleInfo == null ) {
325- GitHubIssuesConfig config = GitHubIssuesConfig .getInstance ();
326- Date dueDate = config .getScheduleDueDate (repository , this );
327- int interval = config .getScheduleInterval (repository , this );
398+ scheduleInfo = createScheduleInfo ();
399+ }
400+ return scheduleInfo ;
401+ }
402+
403+ private IssueScheduleInfo createScheduleInfo () {
404+ Milestone milestone = getMilestone ();
405+ if (milestone != null ) {
406+ Date dueDate = milestone .getDueOn ();
328407 if (dueDate != null ) {
329- if (interval > 0 ) {
330- scheduleInfo = new IssueScheduleInfo (dueDate , interval );
331- } else {
332- scheduleInfo = new IssueScheduleInfo (dueDate );
333- }
408+ return new IssueScheduleInfo (dueDate , 1 );
334409 }
335410 }
336- return scheduleInfo ;
411+ // XXX remove ?
412+ // GitHubIssuesConfig config = GitHubIssuesConfig.getInstance();
413+ // Date dueDate = config.getScheduleDueDate(repository, this);
414+ // int interval = config.getScheduleInterval(repository, this);
415+ // if (dueDate != null) {
416+ // if (interval > 0) {
417+ // return new IssueScheduleInfo(dueDate, interval);
418+ // } else {
419+ // return new IssueScheduleInfo(dueDate);
420+ // }
421+ // }
422+ return null ;
337423 }
338424
339425 @ NbBundle .Messages ({
0 commit comments