Skip to content

Commit 0b05c58

Browse files
committed
Merge branch 'nb80'
2 parents 120ef67 + 5f81a05 commit 0b05c58

16 files changed

Lines changed: 1255 additions & 25 deletions

File tree

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ This plugin provides support for GitHub Issue Tracker.
1010
- Edit an issue comment
1111
- Delete an issue comment
1212
- Search issues with issue number or keywords
13+
- Create a new label
14+
- Create a new milestone
15+
- Set a schedule for an issue
1316

1417
## Usage
1518

Binary file not shown.

pom.xml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>com.junichi11</groupId>
55
<artifactId>netbeans-github-issues</artifactId>
6-
<version>0.0.3-SNAPSHOT</version>
6+
<version>0.0.4-SNAPSHOT</version>
77
<packaging>nbm</packaging>
88
<build>
99
<plugins>
@@ -49,6 +49,11 @@
4949
<enabled>false</enabled>
5050
</snapshots>
5151
</repository>
52+
<repository>
53+
<id>unknown-jars-temp-repo</id>
54+
<name>A temporary repository created by NetBeans for libraries and jars it could not identify. Please replace the dependencies in this repository with correct ones and delete this repository.</name>
55+
<url>file:${project.basedir}/lib</url>
56+
</repository>
5257
</repositories>
5358
<dependencies>
5459
<dependency>
@@ -124,6 +129,11 @@
124129
<artifactId>org-netbeans-modules-options-api</artifactId>
125130
<version>RELEASE80</version>
126131
</dependency>
132+
<dependency>
133+
<groupId>unknown.binary</groupId>
134+
<artifactId>swingx-all-1.6.4</artifactId>
135+
<version>SNAPSHOT</version>
136+
</dependency>
127137
</dependencies>
128138
<properties>
129139
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -136,6 +146,11 @@
136146
&lt;li&gt;Create a new issue&lt;/li&gt;
137147
&lt;li&gt;Edit an issue&lt;/li&gt;
138148
&lt;li&gt;Create queries&lt;/li&gt;
149+
&lt;li&gt;Edit an issue comment&lt;/li&gt;
150+
&lt;li&gt;Delete an issue comment&lt;/li&gt;
139151
&lt;li&gt;Search issues with issue number or keywords&lt;/li&gt;
152+
&lt;li&gt;Create a new label&lt;/li&gt;
153+
&lt;li&gt;Create a new milestone&lt;/li&gt;
154+
&lt;li&gt;Set a schedule for an issue&lt;/li&gt;
140155
&lt;/ul&gt;</description>
141156
</project>

src/main/java/com/junichi11/netbeans/modules/github/issues/GitHubCache.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,21 @@ public List<User> getCollaborators() {
132132
* @return milestones
133133
*/
134134
public List<Milestone> getMilestones() {
135-
if (milestones == null) {
135+
return getMilestones(false);
136+
}
137+
138+
/**
139+
* Get milestones.
140+
*
141+
* @param force {@code true} if don't use cache data, otherwise
142+
* {@code false}
143+
* @return milestones
144+
*/
145+
public List<Milestone> getMilestones(boolean force) {
146+
if (milestones == null || force) {
147+
if (milestones != null) {
148+
milestones.clear();
149+
}
136150
Repository gHRepository = repository.getRepository();
137151
GitHubClient client = repository.createGitHubClient();
138152
if (client == null) {
@@ -154,7 +168,20 @@ public List<Milestone> getMilestones() {
154168
* @return labels
155169
*/
156170
public List<Label> getLabels() {
157-
if (labels == null) {
171+
return getLabels(false);
172+
}
173+
174+
/**
175+
* Get labels.
176+
*
177+
* @param force {@code true} if reload labels, otherwise {@code false}
178+
* @return labels
179+
*/
180+
public List<Label> getLabels(boolean force) {
181+
if (labels == null || force) {
182+
if (labels != null) {
183+
labels.clear();
184+
}
158185
GitHubClient client = repository.createGitHubClient();
159186
if (client == null) {
160187
return Collections.emptyList();

src/main/java/com/junichi11/netbeans/modules/github/issues/GitHubIssuesConfig.java

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,14 @@
4141
*/
4242
package com.junichi11.netbeans.modules.github.issues;
4343

44+
import com.junichi11.netbeans.modules.github.issues.issue.GitHubIssue;
4445
import com.junichi11.netbeans.modules.github.issues.query.GitHubQuery;
4546
import com.junichi11.netbeans.modules.github.issues.repository.GitHubRepository;
4647
import com.junichi11.netbeans.modules.github.issues.utils.StringUtils;
48+
import java.text.DateFormat;
49+
import java.text.ParseException;
50+
import java.text.SimpleDateFormat;
51+
import java.util.Date;
4752
import java.util.prefs.BackingStoreException;
4853
import java.util.prefs.Preferences;
4954
import org.openide.util.Exceptions;
@@ -56,8 +61,12 @@
5661
public final class GitHubIssuesConfig {
5762

5863
private static final GitHubIssuesConfig INSTANCE = new GitHubIssuesConfig();
64+
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd"); // NOI18N
5965
private static final String QUERY = "query"; // NOI18N
6066
private static final String QUERY_PARAMS = "query.params"; // NOI18N
67+
private static final String SCHEDULE = "schedule"; // NOI18N
68+
private static final String SCHEDULE_DUE_DATE = "schedule.due"; // NOI18N
69+
private static final String SCHEDULE_INTERVAL = "schedule.interval"; // NOI18N
6170

6271
private GitHubIssuesConfig() {
6372
}
@@ -67,7 +76,7 @@ public static GitHubIssuesConfig getInstance() {
6776
}
6877

6978
/**
70-
* Reteurn saved query names.
79+
* Return saved query names.
7180
*
7281
* @param repository repository
7382
* @return saved query names
@@ -125,7 +134,80 @@ public void removeQuery(GitHubRepository repository, GitHubQuery query) {
125134
}
126135
}
127136

137+
public void setScheduleDueDate(GitHubRepository repository, GitHubIssue issue, Date dueDate) {
138+
Preferences preferences = getPreferences(repository);
139+
String id = issue.getID();
140+
if (StringUtils.isEmpty(id)) {
141+
return;
142+
}
143+
preferences.node(SCHEDULE).node(id).put(SCHEDULE_DUE_DATE, DATE_FORMAT.format(dueDate));
144+
}
145+
146+
public Date getScheduleDueDate(GitHubRepository repository, GitHubIssue issue) {
147+
Preferences preferences = getPreferences(repository);
148+
String id = issue.getID();
149+
if (StringUtils.isEmpty(id)) {
150+
return null;
151+
}
152+
String dateString = preferences.node(SCHEDULE).node(id).get(SCHEDULE_DUE_DATE, null);
153+
if (StringUtils.isEmpty(dateString)) {
154+
return null;
155+
}
156+
try {
157+
return DateFormat.getDateInstance().parse(dateString);
158+
} catch (ParseException ex) {
159+
Exceptions.printStackTrace(ex);
160+
}
161+
return null;
162+
}
163+
164+
public void setScheduleInterval(GitHubRepository repository, GitHubIssue issue, int interval) {
165+
Preferences preferences = getPreferences(repository);
166+
String id = issue.getID();
167+
if (StringUtils.isEmpty(id)) {
168+
return;
169+
}
170+
preferences.node(SCHEDULE).node(id).putInt(SCHEDULE_INTERVAL, interval);
171+
}
172+
173+
public int getScheduleInterval(GitHubRepository repository, GitHubIssue issue) {
174+
Preferences preferences = getPreferences(repository);
175+
String id = issue.getID();
176+
if (StringUtils.isEmpty(id)) {
177+
return -1;
178+
}
179+
return preferences.node(SCHEDULE).node(id).getInt(SCHEDULE_INTERVAL, -1);
180+
}
181+
182+
public void removeSchedule(GitHubRepository repository, GitHubIssue issue) {
183+
Preferences preferences = getPreferences(repository);
184+
String id = issue.getID();
185+
if (StringUtils.isEmpty(id)) {
186+
return;
187+
}
188+
preferences = preferences.node(SCHEDULE).node(id);
189+
try {
190+
preferences.removeNode();
191+
} catch (BackingStoreException ex) {
192+
Exceptions.printStackTrace(ex);
193+
}
194+
}
195+
196+
public void removeRepository(GitHubRepository repository) {
197+
Preferences preferences = getPreferences(repository);
198+
try {
199+
preferences.removeNode();
200+
} catch (BackingStoreException ex) {
201+
Exceptions.printStackTrace(ex);
202+
}
203+
}
204+
128205
private Preferences getPreferences() {
129206
return NbPreferences.forModule(GitHubIssuesConfig.class);
130207
}
208+
209+
private Preferences getPreferences(GitHubRepository repository) {
210+
String id = repository.getID();
211+
return getPreferences().node(id);
212+
}
131213
}

src/main/java/com/junichi11/netbeans/modules/github/issues/issue/GitHubIssue.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@
4242
package com.junichi11.netbeans.modules.github.issues.issue;
4343

4444
import com.junichi11.netbeans.modules.github.issues.GitHubIssueState;
45+
import com.junichi11.netbeans.modules.github.issues.GitHubIssuesConfig;
4546
import com.junichi11.netbeans.modules.github.issues.repository.GitHubRepository;
4647
import java.beans.PropertyChangeListener;
4748
import java.beans.PropertyChangeSupport;
4849
import java.io.File;
50+
import java.util.Calendar;
4951
import java.util.Collection;
5052
import java.util.Collections;
5153
import java.util.Date;
@@ -62,6 +64,8 @@
6264
import org.netbeans.modules.bugtracking.issuetable.IssueNode;
6365
import org.netbeans.modules.bugtracking.spi.IssueController;
6466
import org.netbeans.modules.bugtracking.spi.IssueProvider;
67+
import org.netbeans.modules.bugtracking.spi.IssueScheduleInfo;
68+
import org.netbeans.modules.bugtracking.spi.IssueScheduleProvider;
6569
import org.netbeans.modules.bugtracking.spi.IssueStatusProvider;
6670
import org.openide.util.NbBundle;
6771
import org.pegdown.Extensions;
@@ -77,6 +81,7 @@ public final class GitHubIssue {
7781
private Issue issue;
7882
private IssueNode node;
7983
private GitHubIssueController controller;
84+
private IssueScheduleInfo scheduleInfo;
8085
private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
8186
public static final String LABEL_NAME_ID = "github.issue.id"; // NOI18N
8287
public static final String LABEL_NAME_STATUS = "github.issue.status"; // NOI18N
@@ -285,6 +290,52 @@ public List<Comment> getComments() {
285290
return repository.getComments(issue.getNumber());
286291
}
287292

293+
// schedule
294+
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();
305+
}
306+
307+
public Date getDueDate() {
308+
IssueScheduleInfo info = getSchedule();
309+
if (info == null) {
310+
return null;
311+
}
312+
Calendar calendar = Calendar.getInstance();
313+
Date date = info.getDate();
314+
int interval = info.getInterval();
315+
if (interval < 1) {
316+
return null;
317+
}
318+
calendar.setTime(date);
319+
calendar.add(Calendar.DATE, interval);
320+
return calendar.getTime();
321+
}
322+
323+
public IssueScheduleInfo getSchedule() {
324+
if (scheduleInfo == null) {
325+
GitHubIssuesConfig config = GitHubIssuesConfig.getInstance();
326+
Date dueDate = config.getScheduleDueDate(repository, this);
327+
int interval = config.getScheduleInterval(repository, this);
328+
if (dueDate != null) {
329+
if (interval > 0) {
330+
scheduleInfo = new IssueScheduleInfo(dueDate, interval);
331+
} else {
332+
scheduleInfo = new IssueScheduleInfo(dueDate);
333+
}
334+
}
335+
}
336+
return scheduleInfo;
337+
}
338+
288339
@NbBundle.Messages({
289340
"GitHubIssue.column.descriptor.issueType.displayName=Issue Type",
290341
"GitHubIssue.column.descriptor.summary.displayName=Summary",
@@ -360,4 +411,8 @@ void fireStatusChange() {
360411
propertyChangeSupport.firePropertyChange(IssueStatusProvider.EVENT_STATUS_CHANGED, null, null);
361412
}
362413

414+
void fireScheduleChange() {
415+
propertyChangeSupport.firePropertyChange(IssueScheduleProvider.EVENT_ISSUE_SCHEDULE_CHANGED, null, null);
416+
}
417+
363418
}

src/main/java/com/junichi11/netbeans/modules/github/issues/issue/GitHubIssueProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,12 @@ public IssueController getController(GitHubIssue issue) {
109109
}
110110

111111
@Override
112-
public void removePropertyChangeListener(GitHubIssue issue, PropertyChangeListener listener) {
112+
public void addPropertyChangeListener(GitHubIssue issue, PropertyChangeListener listener) {
113113
issue.addPropertyChangeListener(listener);
114114
}
115115

116116
@Override
117-
public void addPropertyChangeListener(GitHubIssue issue, PropertyChangeListener listener) {
117+
public void removePropertyChangeListener(GitHubIssue issue, PropertyChangeListener listener) {
118118
issue.removePropertyChangeListener(listener);
119119
}
120120

src/main/java/com/junichi11/netbeans/modules/github/issues/issue/GitHubIssueScheduleProvider.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,17 @@ public class GitHubIssueScheduleProvider implements IssueScheduleProvider<GitHub
5353

5454
@Override
5555
public void setSchedule(GitHubIssue issue, IssueScheduleInfo info) {
56+
issue.setSchedule(info);
5657
}
5758

5859
@Override
5960
public Date getDueDate(GitHubIssue issue) {
60-
return null;
61+
return issue.getDueDate();
6162
}
6263

6364
@Override
6465
public IssueScheduleInfo getSchedule(GitHubIssue issue) {
65-
return null;
66+
return issue.getSchedule();
6667
}
6768

6869
}

src/main/java/com/junichi11/netbeans/modules/github/issues/issue/ui/GitHubIssuePanel.form

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242
<Group type="102" alignment="1" attributes="0">
4343
<Component id="headerErrorLabel" min="-2" max="-2" attributes="0"/>
4444
<EmptySpace max="32767" attributes="0"/>
45+
<Component id="newMilestoneButton" min="-2" max="-2" attributes="0"/>
46+
<EmptySpace max="-2" attributes="0"/>
47+
<Component id="newLabelButton" min="-2" max="-2" attributes="0"/>
48+
<EmptySpace max="-2" attributes="0"/>
4549
<Component id="headerSubmitButton" min="-2" max="-2" attributes="0"/>
4650
</Group>
4751
<Group type="102" attributes="0">
@@ -100,6 +104,8 @@
100104
<Group type="103" groupAlignment="3" attributes="0">
101105
<Component id="headerSubmitButton" alignment="3" min="-2" max="-2" attributes="0"/>
102106
<Component id="headerErrorLabel" alignment="3" min="-2" max="-2" attributes="0"/>
107+
<Component id="newLabelButton" alignment="3" min="-2" max="-2" attributes="0"/>
108+
<Component id="newMilestoneButton" alignment="3" min="-2" max="-2" attributes="0"/>
103109
</Group>
104110
</Group>
105111
</Group>
@@ -201,6 +207,26 @@
201207
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="refreshLinkButtonActionPerformed"/>
202208
</Events>
203209
</Component>
210+
<Component class="javax.swing.JButton" name="newLabelButton">
211+
<Properties>
212+
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
213+
<ResourceString bundle="com/junichi11/netbeans/modules/github/issues/issue/ui/Bundle.properties" key="GitHubIssuePanel.newLabelButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
214+
</Property>
215+
</Properties>
216+
<Events>
217+
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="newLabelButtonActionPerformed"/>
218+
</Events>
219+
</Component>
220+
<Component class="javax.swing.JButton" name="newMilestoneButton">
221+
<Properties>
222+
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
223+
<ResourceString bundle="com/junichi11/netbeans/modules/github/issues/issue/ui/Bundle.properties" key="GitHubIssuePanel.newMilestoneButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
224+
</Property>
225+
</Properties>
226+
<Events>
227+
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="newMilestoneButtonActionPerformed"/>
228+
</Events>
229+
</Component>
204230
</SubComponents>
205231
</Container>
206232
<Container class="javax.swing.JScrollPane" name="mainScrollPane">

0 commit comments

Comments
 (0)