package com.kenai.redminenb.issue; import com.kenai.redminenb.Redmine; import com.kenai.redminenb.issue.JournalDisplay.JournalData; import com.kenai.redminenb.ui.Defaults; import com.kenai.redminenb.user.RedmineUser; import com.kenai.redminenb.util.ListComboBoxModel; import com.kenai.redminenb.util.RedmineUtil; import com.kenai.redminenb.repository.RedmineRepository; import com.kenai.redminenb.util.AssigneeWrapper; import com.kenai.redminenb.util.AttachmentDisplay; import com.kenai.redminenb.util.ExceptionHandler; import com.kenai.redminenb.util.ExpandablePanel; import com.taskadapter.redmineapi.bean.IssueCategory; import com.taskadapter.redmineapi.bean.IssuePriority; import com.taskadapter.redmineapi.bean.IssueStatus; import com.taskadapter.redmineapi.bean.Tracker; import com.taskadapter.redmineapi.bean.Version; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.net.MalformedURLException; import java.net.URL; import java.text.NumberFormat; import java.util.Collection; import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.DefaultComboBoxModel; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JToggleButton; import javax.swing.LayoutStyle; import org.apache.commons.lang.StringUtils; import com.kenai.redminenb.util.LinkButton; import com.kenai.redminenb.util.NestedProject; import com.kenai.redminenb.util.NullOrIntegerFormat; import com.kenai.redminenb.util.SafeAutoCloseable; import com.kenai.redminenb.util.VerticalScrollPane; import com.taskadapter.redmineapi.RedmineException; import com.taskadapter.redmineapi.bean.Attachment; import com.taskadapter.redmineapi.bean.CustomField; import com.taskadapter.redmineapi.bean.CustomFieldDefinition; import com.taskadapter.redmineapi.bean.CustomFieldFactory; import com.taskadapter.redmineapi.bean.Issue; import com.taskadapter.redmineapi.bean.IssueCategoryFactory; import com.taskadapter.redmineapi.bean.Journal; import com.taskadapter.redmineapi.bean.Project; import com.taskadapter.redmineapi.bean.ProjectFactory; import com.taskadapter.redmineapi.bean.TimeEntry; import com.taskadapter.redmineapi.bean.TimeEntryActivity; import com.taskadapter.redmineapi.bean.TimeEntryFactory; import com.taskadapter.redmineapi.bean.TrackerFactory; import com.taskadapter.redmineapi.bean.VersionFactory; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; import java.text.ParseException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import javax.swing.Box.Filler; import javax.swing.JFileChooser; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.xml.ws.Holder; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.awt.DropDownButtonFactory; import org.openide.awt.HtmlBrowser; import org.openide.util.Exceptions; import org.openide.util.ImageUtilities; import org.openide.util.Mutex; import org.openide.util.NbBundle; import org.openide.windows.WindowManager; /** * Panel showing a Redmine Issue. * * @author Mykolas * @author Anchialas <anchialas@gmail.com> */ @NbBundle.Messages({ "BTN_AddAttachment=Add attachment" }) public class RedmineIssuePanel extends VerticalScrollPane { private static final Logger LOG = Logger.getLogger(RedmineIssuePanel.class.getName()); private static final long serialVersionUID = 9011030935877495476L; private static File lastDirectory; // private final RedmineIssue redmineIssue; // private JButton toolbarPopupButton; private JPopupMenu toolbarPopup; private final ExpandablePanel commentPanel; private final ExpandablePanel logtimePanel; private final static int CUSTOM_ROW_START = 9; private final static int CUSTOM_ROW_END = 18; private final List<CustomFieldComponent> customFields = new ArrayList<>(); Map<Integer,Object> customFieldValueBackingStore = new HashMap<>(); private final AtomicInteger updateRunning = new AtomicInteger(0); private final ItemListener projectTrackerListener = new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (updateRunning.compareAndSet(0, 1)) { final NestedProject np = (NestedProject) projectComboBox.getSelectedItem(); final Project project; if (np != null) { project = np.getProject(); } else { project = null; } final Tracker tracker = (Tracker) trackerComboBox.getSelectedItem(); RedmineIssuePanel.this.redmineIssue.getRepository().getRequestProcessor().execute(new Runnable() { @Override public void run() { try { initProjectData(false, project, tracker, null); } finally { updateRunning.set(0); } } }); } } }; public RedmineIssuePanel(RedmineIssue redmineIssue) { this.redmineIssue = redmineIssue; initComponents(); projectComboBox.addItemListener(projectTrackerListener); trackerComboBox.addItemListener(projectTrackerListener); updateCommentTabPanel.setVisible(false); commentPanel = new ExpandablePanel(updateCommentLabel, updateCommentTabPanel); logtimeInputPanel.setVisible(false); logtimePanel = new ExpandablePanel(logtimeLabel, logtimeInputPanel); privateCheckBox.setVisible(false); updateRunning.set(1); redmineIssue.getRepository().getRequestProcessor().execute(new Runnable() { @Override public void run() { Runnable edtUpdate = initValues(); initIssueUnderUpdateLock(edtUpdate); updateRunning.set(0); } }); } public void clearCustomFields() { for (CustomFieldComponent cfc : customFields) { issuePane.remove(cfc); issuePane.remove(cfc.getLabel()); } customFields.clear(); } public void addCustomField(CustomFieldComponent cfc) { int row = CUSTOM_ROW_START + (customFields.size() / 2); if(row > CUSTOM_ROW_END) { throw new IllegalStateException("Maximum custom field count reached"); } boolean even = customFields.size() % 2 == 0; GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.BASELINE_LEADING; gbc.gridx = even ? 0 : 3; gbc.gridy = row; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.insets = new Insets(2, 2, 2, 2); gbc.weightx = 0; issuePane.add(cfc.getLabel(), gbc); gbc.weightx = 1; gbc.gridx = even ? 1 : 4; gbc.gridwidth = 2; issuePane.add(cfc, gbc); customFields.add(cfc); } public CustomFieldComponent getCustomFieldById(Integer id) { for(CustomFieldComponent cfc: customFields) { if(cfc.getCustomFieldDefinition().getId().equals(id)) { return cfc; } } return null; } public List<CustomFieldComponent> getCustomFields() { return Collections.unmodifiableList(customFields); } void updateCommentTextileOutput() { updateCommentHtmlOutputLabel.setTextileText(updateCommentTextArea.getText()); } void updateTextileOutput() { htmlOutputLabel.setTextileText(descTextArea.getText()); } void addToolbarPopupButton() { toolbarPopup = new JPopupMenu(); toolbarPopupButton = DropDownButtonFactory.createDropDownButton(Defaults.getIcon("redmine.png"), toolbarPopup); toolbar.add(toolbarPopupButton); } void addToolbarAction(Action a, boolean addToPopup) { if (a.getValue(Action.SHORT_DESCRIPTION) == null) { a.putValue(Action.SHORT_DESCRIPTION, a.getValue(Action.NAME)); } if (addToPopup) { if (toolbarPopup == null) { addToolbarPopupButton(); } toolbarPopup.add(a); } else { if (Boolean.TRUE.equals(a.getValue(Defaults.TOGGLE_BUTTON_KEY))) { JToggleButton toggleButton = new JToggleButton(a); toggleButton.putClientProperty("hideActionText", Boolean.TRUE); //NOI18N toolbar.add(toggleButton); } else { toolbar.add(a); } } } void setDefaultPopupAction(Action a) { if (toolbarPopupButton == null) { addToolbarPopupButton(); } toolbarPopupButton.addActionListener(a); } final void initIssue() { if(updateRunning.compareAndSet(0, 1)) { try { initIssueUnderUpdateLock(null); } finally { updateRunning.set(0); } } } /** * Initialize panel data from issue. * * @param edtUpdate can be null, if not null is called on the EDT */ private void initIssueUnderUpdateLock(final Runnable edtUpdate) { assert !SwingUtilities.isEventDispatchThread(); final com.taskadapter.redmineapi.bean.Issue issue = this.redmineIssue.getIssue(); final Holder<RedmineIssue> parentIssue = new Holder<>(); final Holder<IssueStatus> issueStatus = new Holder<>(); final Holder<IssuePriority> ip = new Holder<>(); final Holder<NestedProject> defaultProject = new Holder<>(); final ArrayList<JournalData> journal = new ArrayList<>(); if (issue != null && issue.getPriorityId() != null) { ip.value = redmineIssue.getRepository().getIssuePriority(issue.getPriorityId()); } else { ip.value = redmineIssue.getRepository().getDefaultIssuePriority(); } if (issue != null && issue.getStatusId() != null) { issueStatus.value = redmineIssue.getRepository().getStatus(issue.getStatusId()); } if (issue != null && issue.getJournals() != null) { List<Journal> journalEntries = new ArrayList<>(issue.getJournals()); Collections.sort(journalEntries, RedmineUtil.JournalComparator.SINGLETON); for (int i = 0; i < journalEntries.size(); i++) { journal.add(JournalDisplay.buildJournalData( redmineIssue, journalEntries.get(i), i)); } } try { if (redmineIssue.getRepository().getProject() != null) { defaultProject.value = new NestedProject(redmineIssue.getRepository().getProject()); } else { defaultProject.value = redmineIssue.getRepository().getProjects().values().iterator().next(); } } catch (NullPointerException ex) { } if (issue.getProjectId() == null && defaultProject.value != null) { issue.setProjectId(defaultProject.value.getProject().getId()); issue.setProjectName(defaultProject.value.getProject().getName()); } if (redmineIssue.hasParent() && issue != null) { final String parentKey = String.valueOf(issue.getParentId()); parentIssue.value = RedmineUtil.getIssue(redmineIssue.getRepository(), parentKey); if (parentIssue.value == null) { // how could this be possible? parent removed? Redmine.LOG.log(Level.INFO, "issue {0} is referencing a not available parent with id {1}", new Object[]{redmineIssue.getID(), parentKey}); // NOI18N return; } } Runnable edtUpdate2 = new Runnable() { @Override public void run() { if (edtUpdate != null) { edtUpdate.run(); } headPane.setVisible(!redmineIssue.isNew()); parentHeaderPanel.setVisible(!redmineIssue.isNew()); headerLabel.setVisible(!redmineIssue.isNew()); createdLabel.setVisible(!redmineIssue.isNew()); createdValueLabel.setVisible(!redmineIssue.isNew()); updatedLabel.setVisible(!redmineIssue.isNew()); updatedValueLabel.setVisible(!redmineIssue.isNew()); createButton.setVisible(redmineIssue.isNew()); updateButton.setVisible(!redmineIssue.isNew()); toolbar.setVisible(!redmineIssue.isNew()); if (!redmineIssue.isNew()) { Dimension dim = headerLabel.getPreferredSize(); headerLabel.setMinimumSize(new Dimension(0, dim.height)); headerLabel.setPreferredSize(new Dimension(0, dim.height)); headerLabel.setText(redmineIssue.getDisplayName()); synchronized (RedmineIssue.DATETIME_FORMAT) { if (issue.getCreatedOn() != null) { createdValueLabel.setText( RedmineIssue.DATETIME_FORMAT.format(issue.getCreatedOn()) + " by " + issue.getAuthorName()); } if (issue.getUpdatedOn() == null) { updatedLabel.setVisible(false); updatedValueLabel.setVisible(false); updatedValueLabel.setText(null); } else { updatedLabel.setVisible(true); updatedValueLabel.setVisible(true); updatedValueLabel.setText(RedmineIssue.DATETIME_FORMAT.format(issue.getUpdatedOn())); } } subjectTextField.setText(issue.getSubject()); parentTaskTextField.setValue(issue.getParentId()); descTextArea.setText(issue.getDescription()); descTextArea.setCaretPosition(0); trackerComboBox.setSelectedItem(issue.getTracker()); statusComboBox.setSelectedItem(issueStatus.value); categoryComboBox.setSelectedItem(issue.getCategory()); Project project = ProjectFactory.create(issue.getProjectId()); project.setName(issue.getProjectName()); projectComboBox.setSelectedItem(new NestedProject(project)); priorityComboBox.setSelectedItem(ip.value); if (priorityComboBox.getSelectedIndex() < 0) { priorityComboBox.addItem(ip.value); priorityComboBox.setSelectedItem(ip.value); } if (issue.getAssigneeId() == null) { assigneeComboBox.setSelectedItem(null); } else { assigneeComboBox.setSelectedItem(new AssigneeWrapper(issue.getAssigneeId(), issue.getAssigneeName())); } targetVersionComboBox.setSelectedItem(issue.getTargetVersion()); startDateChooser.setDate(issue.getStartDate()); dueDateChooser.setDate(issue.getDueDate()); estimateTimeTextField.setValue(issue.getEstimatedHours()); doneComboBox.setSelectedIndex(Math.round(issue.getDoneRatio() / 10f)); if (issue.getJournals() != null && issue.getJournals().size() > 0) { journalOuterPane.setVisible(true); } else { journalOuterPane.setVisible(false); } journalPane.removeAll(); for (JournalData jd : journal) { journalPane.add(new JournalDisplay(jd)); } journalPane.doLayout(); journalPane.revalidate(); attachmentPanel.removeAll(); if (issue.getAttachments() != null) { for (Attachment ad : issue.getAttachments()) { AttachmentDisplay adisplay = new AttachmentDisplay(redmineIssue, ad); adisplay.setAlignmentX(Component.LEFT_ALIGNMENT); attachmentPanel.add(adisplay); } } LinkButton lb = new LinkButton(); lb.setBorder(null); lb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/kenai/redminenb/resources/add.png"))); lb.setToolTipText(Bundle.BTN_AddAttachment()); lb.setActionCommand("addAttachment"); lb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JPanel panel = new JPanel(new GridBagLayout()); final JLabel descLabel = new JLabel("Description: "); final JLabel commandLabel = new JLabel("Comment: "); final JTextArea comment = new JTextArea(); JScrollPane commenctScrollPane = new JScrollPane(comment); final JTextField description = new JTextField(); Dimension min = description.getMinimumSize(); Dimension pref = description.getPreferredSize(); Dimension max = description.getMaximumSize(); min.setSize(250, min.getHeight()); pref.setSize(250, min.getHeight()); max.setSize(max.getWidth(), min.getHeight()); description.setMinimumSize(min); description.setPreferredSize(pref); description.setMaximumSize(max); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.BASELINE_LEADING; gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 0; gbc.weighty = 0; panel.add(descLabel, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.weightx = 1; gbc.weighty = 0; panel.add(description, gbc); gbc.gridx = 0; gbc.gridy = 2; gbc.weightx = 0; gbc.weighty = 0; panel.add(commandLabel, gbc); gbc.gridx = 0; gbc.gridy = 3; gbc.weightx = 1; gbc.weighty = 1; panel.add(commenctScrollPane, gbc); panel.add(new Filler(new Dimension(0, 0), new Dimension(0, 0), new Dimension(Short.MAX_VALUE, Short.MAX_VALUE))); JFileChooser fileChooser = new JFileChooser(lastDirectory); fileChooser.setAccessory(panel); fileChooser.setDialogTitle("Add attachment"); int result = fileChooser.showOpenDialog(WindowManager.getDefault().getMainWindow()); if (result == JFileChooser.APPROVE_OPTION) { lastDirectory = fileChooser.getCurrentDirectory(); final File selectedFile = fileChooser.getSelectedFile(); redmineIssue.getRepository().getRequestProcessor().execute(new Runnable() { @Override public void run() { redmineIssue.attachFile(selectedFile, description.getText(), comment.getText(), false); redmineIssue.refresh(); initIssue(); } }); } } }); attachmentPanel.add(lb); if (parentIssue.value != null) { parentHeaderPanel.setVisible(true); parentHeaderPanel.removeAll(); headerLabel.setIcon(ImageUtilities.loadImageIcon("com/kenai/redminenb/resources/subtask.png", true)); // NOI18N GroupLayout layout = new GroupLayout(parentHeaderPanel); JLabel parentLabel = new JLabel(); parentLabel.setText(parentIssue.value.getSummary()); LinkButton parentButton = new LinkButton(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { RedmineUtil.openIssue(parentIssue.value); } }); parentButton.setText(String.format("%s#%s:", parentIssue.value.getIssue().getTracker().getName(), parentIssue.value.getID())); layout.setHorizontalGroup( layout.createSequentialGroup().addComponent(parentButton) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addComponent(parentLabel)); layout.setVerticalGroup( layout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(parentButton).addComponent(parentLabel)); parentHeaderPanel.add(parentButton); parentHeaderPanel.setLayout(layout); } else { // no parent issue parentHeaderPanel.setVisible(false); parentHeaderPanel.removeAll(); headerLabel.setIcon(null); } journalOuterPane.setVisible(true); commentPanel.setVisible(true); logtimePanel.setVisible(true); descriptionPanel.setSelectedIndex(1); attachmentLabel.setVisible(true); attachmentPanel.setVisible(true); spentHoursLabel.setText(NbBundle.getMessage(getClass(), "RedmineIssuePanel.spentHoursReplacementLabel.text", issue.getSpentHours())); } else { // new issue setBorder(BorderFactory.createEmptyBorder(6, 0, 0, 0)); trackerComboBox.setSelectedItem(0); statusComboBox.setSelectedIndex(0); priorityComboBox.setSelectedItem(ip.value); categoryComboBox.setSelectedItem(null); projectComboBox.setSelectedItem(defaultProject.value); subjectTextField.setText(null); parentTaskTextField.setValue(null); descTextArea.setText(null); assigneeComboBox.setSelectedItem(null); targetVersionComboBox.setSelectedItem(null); startDateChooser.setDate(null); dueDateChooser.setDate(null); estimateTimeTextField.setValue(null); doneComboBox.setSelectedIndex(0); journalOuterPane.setVisible(false); commentPanel.setVisible(false); logtimePanel.setVisible(false); descriptionPanel.setSelectedIndex(0); attachmentLabel.setVisible(false); attachmentPanel.setVisible(false); spentHoursLabel.setText(""); } setInfoMessage(null); updateTextileOutput(); } }; if (issue != null) { initProjectData(true, ProjectFactory.create(issue.getProjectId()), issue.getTracker(), edtUpdate2); } else { initProjectData(true, null, null, edtUpdate2); } } /** * Initialize project/tracker dependend data. * * @param init indicates whether this is called after the issue was completely reset or just project/tracker changed * @param project currently selected project * @param tracker currently selected tracker * @param edtInit can be null, if not null will be called on the EDT before further updates */ private void initProjectData(final boolean init, final Project project, final Tracker tracker, final Runnable edtInit) { assert !SwingUtilities.isEventDispatchThread(); try (SafeAutoCloseable sac = redmineIssue.busy()) { final ListComboBoxModel<AssigneeWrapper> assigneeModel = new ListComboBoxModel<>(); assigneeModel.add(null); final ListComboBoxModel<IssueCategory> categoryModel = new ListComboBoxModel<>(); categoryModel.add(null); final ListComboBoxModel<Version> versionsModel = new ListComboBoxModel<>(); versionsModel.add(null); final List<CustomFieldDefinition> fieldDefinitions = new ArrayList<>(); if (project != null) { assigneeModel.addAll(redmineIssue.getRepository().getAssigneeWrappers(project)); categoryModel.addAll(redmineIssue.getRepository().getIssueCategories(project)); versionsModel.addAll(redmineIssue.getRepository().getVersions(project)); if (tracker != null) { fieldDefinitions.addAll(redmineIssue.getRepository().getCustomFieldDefinitions("issue", project, tracker)); } } Mutex.EVENT.writeAccess(new Mutex.Action<Void>() { @Override public Void run() { if(edtInit != null) { edtInit.run(); } assigneeModel.setSelectedItem(assigneeComboBox.getSelectedItem()); categoryModel.setSelectedItem(categoryComboBox.getSelectedItem()); versionsModel.setSelectedItem(targetVersionComboBox.getSelectedItem()); if (!assigneeModel.getElements().contains(assigneeModel.getSelectedItem())) { assigneeModel.setSelectedItem(null); } if (!categoryModel.getElements().contains(categoryModel.getSelectedItem())) { categoryModel.setSelectedItem(null); } if (!versionsModel.getElements().contains(versionsModel.getSelectedItem())) { versionsModel.setSelectedItem(null); } categoryComboBox.setModel(categoryModel); assigneeComboBox.setModel(assigneeModel); targetVersionComboBox.setModel(versionsModel); if (assigneeModel.getElements().contains(new AssigneeWrapper(redmineIssue.getRepository().getCurrentUser()))) { assignToMeButton.setEnabled(true); } else { assignToMeButton.setEnabled(false); } versionAddButton.setEnabled(project != null); categoryAddButton.setEnabled(project != null); if (init) { customFieldValueBackingStore.clear(); } else { for (CustomFieldComponent cfc : getCustomFields()) { if(cfc.getCustomFieldDefinition().isMultiple()) { customFieldValueBackingStore.put( cfc.getCustomFieldDefinition().getId(), cfc.getValues()); } else { customFieldValueBackingStore.put( cfc.getCustomFieldDefinition().getId(), cfc.getValue()); } } } clearCustomFields(); for (CustomFieldDefinition cfdd : fieldDefinitions) { CustomFieldComponent cfc = CustomFieldComponent.create(cfdd); Integer id = cfdd.getId(); if (init) { if (redmineIssue.isNew()) { cfc.setDefaultValue(); } else { CustomField cf = redmineIssue.getIssue().getCustomFieldById(cfdd.getId()); if (cf != null) { if (cf.isMultiple()) { cfc.setValues(cf.getValues()); } else { cfc.setValue(cf.getValue()); } } } } else { if (customFieldValueBackingStore.containsKey(id)) { Object value = customFieldValueBackingStore.get(id); if (cfdd.isMultiple() && value instanceof List) { cfc.setValues((List<String>) value); } else if ((!cfdd.isMultiple()) && value instanceof String) { cfc.setValue((String) value); } } else { cfc.setDefaultValue(); } } addCustomField(cfc); } return null; } }); } } synchronized void setInfoMessage(String msg) { infoLabel.setVisible(msg != null); infoLabel.setText(msg); if (msg != null) { infoLabel.setIcon(Defaults.getIcon("info.png")); autoHide(); } } void setErrorMessage(String msg) { infoLabel.setVisible(msg != null); infoLabel.setText(msg); if (msg != null) { infoLabel.setIcon(Defaults.getIcon("error.png")); autoHide(); } } private void autoHide() { redmineIssue.getRepository().getRequestProcessor().post(new Runnable() { @Override public void run() { EventQueue.invokeLater(new Runnable() { @Override public void run() { setInfoMessage(null); } }); } }, 5000); } void enableFields(boolean enabled) { updateButton.setEnabled(enabled); createButton.setEnabled(enabled); projectComboBox.setEnabled(enabled); trackerComboBox.setEnabled(enabled); subjectTextField.setEnabled(enabled); privateCheckBox.setEnabled(enabled); descTextArea.setEnabled(enabled); statusComboBox.setEnabled(enabled); priorityComboBox.setEnabled(enabled); assigneeComboBox.setEnabled(enabled); categoryComboBox.setEnabled(enabled); targetVersionComboBox.setEnabled(enabled); parentTaskTextField.setEnabled(enabled); startDateChooser.setEnabled(enabled); dueDateChooser.setEnabled(enabled); estimateTimeTextField.setEnabled(enabled); doneComboBox.setEnabled(enabled); updateCommentTextArea.setEnabled(enabled); logtimeActivityComboBox.setEnabled(enabled); logtimeSpentTextField.setEnabled(enabled); logtimeCommentLabel.setEnabled(enabled); } private void setIssueData(com.taskadapter.redmineapi.bean.Issue issue) { issue.setTracker((Tracker) trackerComboBox.getSelectedItem()); issue.setStatusId(((IssueStatus) statusComboBox.getSelectedItem()).getId()); issue.setSubject(subjectTextField.getText()); issue.setParentId(getParentTaskId()); issue.setDescription(descTextArea.getText()); issue.setPriorityId(((IssuePriority) priorityComboBox.getSelectedItem()).getId()); if (getSelectedAssignee() != null) { issue.setAssigneeId(getSelectedAssignee().getId()); issue.setAssigneeName(getSelectedAssignee().getName()); } else { issue.setAssigneeId(null); issue.setAssigneeName(null); } issue.setCategory((IssueCategory) categoryComboBox.getSelectedItem()); issue.setTargetVersion((Version) targetVersionComboBox.getSelectedItem()); issue.setStartDate(startDateChooser.getDate()); issue.setDueDate(dueDateChooser.getDate()); issue.setEstimatedHours(getEstimateTime()); issue.setDoneRatio(doneComboBox.getSelectedIndex() * 10); Project p; // Workaround for https://github.com/taskadapter/redmine-java-api/pull/163 try { p = ((NestedProject) projectComboBox.getSelectedItem()).getProject(); issue.setProjectId(p.getId()); } catch (NullPointerException ex) { } for (CustomFieldComponent cfc : getCustomFields()) { CustomFieldDefinition cfd = cfc.getCustomFieldDefinition(); CustomField cf = issue.getCustomFieldById(cfd.getId()); if (cf == null) { cf = CustomFieldFactory.create(cfd.getId()); issue.addCustomField(cf); } if (cfd.isMultiple()) { cf.setValues(cfc.getValues()); } else { cf.setValue(cfc.getValue()); } } } private AssigneeWrapper getSelectedAssignee() { return (AssigneeWrapper) assigneeComboBox.getSelectedItem(); } private Integer getParentTaskId() { Number n = (Number)parentTaskTextField.getValue(); return n == null ? null : n.intValue(); } private Float getEstimateTime() { Number n = (Number)estimateTimeTextField.getValue(); return n == null ? null : n.floatValue(); } RedmineIssue getIssue() { return redmineIssue; } private void createIssue() { com.taskadapter.redmineapi.bean.Issue issue = this.redmineIssue.getIssue(); if (issue == null) { issue = new Issue(); } setIssueData(issue); final Issue inputIssue = issue; new SwingWorker() { @Override protected Object doInBackground() throws Exception { try (SafeAutoCloseable sac = redmineIssue.busy()) { RedmineRepository rr = redmineIssue.getRepository(); Issue issue = rr.getIssueManager().createIssue(inputIssue); redmineIssue.setIssue(issue); redmineIssue.getRepository().getIssueCache().put(redmineIssue); initIssue(); } return null; } @Override protected void done() { try { get(); setInfoMessage("Issue successfully created."); createButton.setVisible(false); updateButton.setVisible(true); } catch (InterruptedException ex) { Redmine.LOG.log(Level.INFO, "Can't create Redmine issue - Interrupted", ex); } catch (ExecutionException ex) { Exception src = (Exception) ex.getCause(); ExceptionHandler.handleException(LOG, "Can't create Redmine issue", src); setErrorMessage("Can't create Redmine issue: " + src.getMessage()); } } }.execute(); } void saveIssue() { final Issue issue = this.redmineIssue.getIssue(); setIssueData(issue); String comment = updateCommentTextArea.getText(); if(! StringUtils.isBlank(comment)) { issue.setNotes(comment); } new SwingWorker() { @Override protected Object doInBackground() throws Exception { try (SafeAutoCloseable sac = redmineIssue.busy()) { redmineIssue.getRepository().getIssueManager().update(issue); redmineIssue.refresh(); initIssue(); } return null; } @Override protected void done() { try { get(); setInfoMessage("Issue successfully saved."); updateCommentTextArea.setText(""); commentPanel.colapse(); logtimePanel.colapse(); createButton.setVisible(false); updateButton.setVisible(true); } catch (InterruptedException ex) { Redmine.LOG.log(Level.INFO, "Can't save Redmine issue - Interrupted", ex); } catch (ExecutionException ex) { Exception src = (Exception) ex.getCause(); ExceptionHandler.handleException(LOG, "Can't create Redmine issue", src); setErrorMessage("Can't save Redmine issue: " + src.getMessage()); } } }.execute(); } /** * @return Runnable that _must_ be called on the EDT */ private Runnable initValues() { assert ! SwingUtilities.isEventDispatchThread() : "Needs to be called off the EDT"; final List<Tracker> trackerList = redmineIssue.getRepository().getTrackers(); final Collection<? extends IssueStatus> statusList = redmineIssue.getRepository().getStatuses(); final List<IssuePriority> issuePriorities = redmineIssue.getRepository().getIssuePriorities(); final List<TimeEntryActivity> timeActivityEntries = redmineIssue.getRepository().getTimeEntryActivities(); final List<NestedProject> projects = new ArrayList<>(redmineIssue.getRepository().getProjects().values()); Collections.sort(projects); return new Runnable() { @Override public void run() { trackerComboBox.setRenderer(new Defaults.TrackerLCR()); trackerComboBox.setModel(new DefaultComboBoxModel(trackerList.toArray())); statusComboBox.setRenderer(new Defaults.IssueStatusLCR()); statusComboBox.setModel(new DefaultComboBoxModel(statusList.toArray())); priorityComboBox.setRenderer(new Defaults.PriorityLCR()); priorityComboBox.setModel(new DefaultComboBoxModel(issuePriorities.toArray())); assigneeComboBox.setRenderer(new Defaults.RepositoryUserLCR()); assigneeComboBox.setPrototypeDisplayValue(new RedmineUser(1, "John, some more space Doe, and some...")); categoryComboBox.setRenderer(new Defaults.IssueCategoryLCR()); targetVersionComboBox.setRenderer(new Defaults.VersionLCR()); logtimeActivityComboBox.setRenderer(new Defaults.TimeEntryActivityLCR()); DefaultComboBoxModel timeEntryActivityModel = new DefaultComboBoxModel( timeActivityEntries.toArray()); for (int i = 0; i < timeEntryActivityModel.getSize(); i++) { TimeEntryActivity tea = (TimeEntryActivity) timeEntryActivityModel.getElementAt(i); if (tea.isDefault()) { timeEntryActivityModel.setSelectedItem(tea); break; } } logtimeActivityComboBox.setModel(timeEntryActivityModel); projectComboBox.setModel(new DefaultComboBoxModel(projects.toArray())); } }; } private boolean isIssueValid() { return true; } @Override protected void paintComponent(Graphics g) { super.paintComponent(Defaults.paintGradient((Graphics2D)g, getWidth(), getHeight())); } void opened() { } void closed() { } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; innerPanel = new VerticalScrollPane(); headPane = new javax.swing.JPanel(); headerLabel = new javax.swing.JLabel(); parentHeaderPanel = new javax.swing.JPanel(); updatedLabel = new javax.swing.JLabel(); createdLabel = new javax.swing.JLabel(); createdValueLabel = new javax.swing.JLabel(); updatedValueLabel = new javax.swing.JLabel(); buttonPane = new javax.swing.JPanel(); updateButton = new javax.swing.JButton(); createButton = new javax.swing.JButton(); toolbar = new org.openide.awt.Toolbar(); filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); issuePane = new javax.swing.JPanel(); descriptionLabel = new javax.swing.JLabel(); categoryComboBox = new javax.swing.JComboBox(); priorityLabel = new javax.swing.JLabel(); estimateTimeLabel1 = new javax.swing.JLabel(); subjectLabel = new javax.swing.JLabel(); estimateTimeLabel = new javax.swing.JLabel(); subjectLabel1 = new javax.swing.JLabel(); parentIdLabel = new javax.swing.JLabel(); doneLabel = new javax.swing.JLabel(); trackerComboBox = new javax.swing.JComboBox(); estimateTimeTextField = new JFormattedTextField(new NullOrIntegerFormat()); startDateLabel = new javax.swing.JLabel(); dueDateLabel = new javax.swing.JLabel(); statusComboBox = new javax.swing.JComboBox(); priorityComboBox = new javax.swing.JComboBox(); doneComboBox = new javax.swing.JComboBox(); subjectTextField = new javax.swing.JTextField(); categoryLabel = new javax.swing.JLabel(); statusLabel = new javax.swing.JLabel(); parentTaskTextField = new JFormattedTextField(new NullOrIntegerFormat()); targetVersionComboBox = new javax.swing.JComboBox(); targetVersionLabel = new javax.swing.JLabel(); assigneeLabel = new javax.swing.JLabel(); subjectLabel2 = new javax.swing.JLabel(); assigneeComboBox = new javax.swing.JComboBox(); privateCheckBox = new javax.swing.JCheckBox(); descriptionPanel = new javax.swing.JTabbedPane(); descScrollPane = new javax.swing.JScrollPane(); descTextArea = new javax.swing.JTextArea(); htmlOutputLabel = new com.kenai.redminenb.util.markup.TextilePreview(); updateCommentLabel = new javax.swing.JLabel(); updateCommentTabPanel = new javax.swing.JTabbedPane(); updateCommentScrollPane1 = new javax.swing.JScrollPane(); updateCommentTextArea = new javax.swing.JTextArea(); updateCommentHtmlOutputLabel = new com.kenai.redminenb.util.markup.TextilePreview(); attachmentLabel = new javax.swing.JLabel(); attachmentPanel = new com.kenai.redminenb.util.DelegatingBaseLineJPanel(); logtimeLabel = new javax.swing.JLabel(); logtimeInputPanel = new javax.swing.JPanel(); logtimeSpentLabel = new javax.swing.JLabel(); logtimeCommentLabel = new javax.swing.JLabel(); logtimeActivityLabel = new javax.swing.JLabel(); logtimeSpentTextField = new javax.swing.JTextField(); logtimeCommentTextField = new javax.swing.JTextField(); logtimeActivityComboBox = new javax.swing.JComboBox(); logtimeSaveButton = new javax.swing.JButton(); logtimeHoursLabel = new javax.swing.JLabel(); spentHoursLabel = new javax.swing.JLabel(); startDateChooser = new com.kenai.redminenb.util.DatePicker(); dueDateChooser = new com.kenai.redminenb.util.DatePicker(); projectComboBox = new javax.swing.JComboBox(); journalOuterPane = new javax.swing.JPanel(); journalPane = new javax.swing.JPanel(); setLayout(new java.awt.BorderLayout()); innerPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); headerLabel.setFont(headerLabel.getFont().deriveFont(headerLabel.getFont().getStyle() | java.awt.Font.BOLD, headerLabel.getFont().getSize()+6)); headerLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.headerLabel.text")); // NOI18N parentHeaderPanel.setOpaque(false); parentHeaderPanel.setRequestFocusEnabled(false); updatedLabel.setFont(updatedLabel.getFont().deriveFont(updatedLabel.getFont().getStyle() & ~java.awt.Font.BOLD, updatedLabel.getFont().getSize()-2)); updatedLabel.setForeground(javax.swing.UIManager.getDefaults().getColor("textInactiveText")); updatedLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.updatedLabel.text")); // NOI18N createdLabel.setFont(createdLabel.getFont().deriveFont(createdLabel.getFont().getStyle() & ~java.awt.Font.BOLD, createdLabel.getFont().getSize()-2)); createdLabel.setForeground(javax.swing.UIManager.getDefaults().getColor("textInactiveText")); createdLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.createdLabel.text")); // NOI18N createdValueLabel.setFont(createdValueLabel.getFont().deriveFont(createdValueLabel.getFont().getStyle() | java.awt.Font.BOLD, createdValueLabel.getFont().getSize()-2)); createdValueLabel.setForeground(javax.swing.UIManager.getDefaults().getColor("textInactiveText")); createdValueLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.createdValueLabel.text")); // NOI18N updatedValueLabel.setFont(updatedValueLabel.getFont().deriveFont(updatedValueLabel.getFont().getStyle() | java.awt.Font.BOLD, updatedValueLabel.getFont().getSize()-2)); updatedValueLabel.setForeground(javax.swing.UIManager.getDefaults().getColor("textInactiveText")); updatedValueLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.updatedValueLabel.text")); // NOI18N javax.swing.GroupLayout headPaneLayout = new javax.swing.GroupLayout(headPane); headPane.setLayout(headPaneLayout); headPaneLayout.setHorizontalGroup( headPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(headPaneLayout.createSequentialGroup() .addGap(12, 12, 12) .addGroup(headPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(headPaneLayout.createSequentialGroup() .addComponent(createdLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(createdValueLabel) .addGap(18, 18, 18) .addComponent(updatedLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(updatedValueLabel) .addGap(246, 246, 246)) .addComponent(parentHeaderPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(headerLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); headPaneLayout.setVerticalGroup( headPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(headPaneLayout.createSequentialGroup() .addContainerGap() .addComponent(parentHeaderPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(1, 1, 1) .addComponent(headerLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(3, 3, 3) .addGroup(headPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(createdLabel) .addComponent(updatedLabel) .addComponent(createdValueLabel) .addComponent(updatedValueLabel)) .addGap(0, 0, 0)) ); buttonPane.setBorder(javax.swing.BorderFactory.createMatteBorder(0, 0, 1, 0, java.awt.Color.gray)); buttonPane.setOpaque(false); updateButton.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.updateButton.text")); // NOI18N updateButton.setToolTipText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.updateButton.toolTipText")); // NOI18N updateButton.setSelected(true); updateButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { updateButtonActionPerformed(evt); } }); createButton.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.createButton.text")); // NOI18N createButton.setToolTipText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.createButton.toolTipText")); // NOI18N createButton.setSelected(true); createButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { createButtonActionPerformed(evt); } }); infoLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/kenai/redminenb/resources/info.png"))); // NOI18N toolbar.setRollover(true); toolbar.setBorderPainted(false); toolbar.setOpaque(false); toolbar.add(filler1); javax.swing.GroupLayout buttonPaneLayout = new javax.swing.GroupLayout(buttonPane); buttonPane.setLayout(buttonPaneLayout); buttonPaneLayout.setHorizontalGroup( buttonPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(buttonPaneLayout.createSequentialGroup() .addComponent(createButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(updateButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(infoLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(toolbar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) ); buttonPaneLayout.setVerticalGroup( buttonPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(buttonPaneLayout.createSequentialGroup() .addGroup(buttonPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(buttonPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(createButton) .addComponent(updateButton)) .addComponent(infoLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(toolbar, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(0, 0, 0)) ); issuePane.setLayout(new java.awt.GridBagLayout()); descriptionLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.descriptionLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(descriptionLabel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(categoryComboBox, gridBagConstraints); priorityLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.priorityLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(priorityLabel, gridBagConstraints); estimateTimeLabel1.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.estimateTimeLabel1.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 5; gridBagConstraints.gridy = 7; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(estimateTimeLabel1, gridBagConstraints); subjectLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.subjectLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(subjectLabel, gridBagConstraints); estimateTimeLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.estimateTimeLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 7; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(estimateTimeLabel, gridBagConstraints); subjectLabel1.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.subjectLabel1.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(subjectLabel1, gridBagConstraints); parentIdLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.parentIdLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 4; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(parentIdLabel, gridBagConstraints); doneLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.doneLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 8; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(doneLabel, gridBagConstraints); trackerComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Bug", "Feature", "Support" })); trackerComboBox.setPrototypeDisplayValue(TrackerFactory.create(-1, "A really long tracker prototype")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(trackerComboBox, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(estimateTimeTextField, gridBagConstraints); startDateLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.startDateLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 5; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(startDateLabel, gridBagConstraints); dueDateLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.dueDateLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 6; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(dueDateLabel, gridBagConstraints); statusComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "New" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 4; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(statusComboBox, gridBagConstraints); priorityComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Low", "Normal", "High", "Urgent", "Immediate" })); priorityComboBox.setSelectedIndex(1); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(priorityComboBox, gridBagConstraints); doneComboBox.setMaximumRowCount(11); doneComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 %", "10 %", "20 %", "30 %", "40 %", "50 %", "60 %", "70 %", "80 %", "90 %", "100 %" })); doneComboBox.setRenderer(new Defaults.PercentLCR()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 8; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(doneComboBox, gridBagConstraints); subjectTextField.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.subjectTextField.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(subjectTextField, gridBagConstraints); wikiSyntaxButton.setBorder(null); wikiSyntaxButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/kenai/redminenb/resources/help.png"))); // NOI18N wikiSyntaxButton.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.wikiSyntaxButton.text")); // NOI18N wikiSyntaxButton.setFont(new java.awt.Font("Lucida Grande", 0, 11)); // NOI18N wikiSyntaxButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { wikiSyntaxButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(wikiSyntaxButton, gridBagConstraints); categoryLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.categoryLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 7; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(categoryLabel, gridBagConstraints); statusLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.statusLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(statusLabel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 4; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(parentTaskTextField, gridBagConstraints); categoryAddButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/kenai/redminenb/resources/add.png"))); // NOI18N categoryAddButton.setToolTipText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.categoryAddButton.toolTipText")); // NOI18N categoryAddButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { categoryAddButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 7; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(categoryAddButton, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 8; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(targetVersionComboBox, gridBagConstraints); targetVersionLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.targetVersionLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 8; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(targetVersionLabel, gridBagConstraints); versionAddButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/kenai/redminenb/resources/add.png"))); // NOI18N versionAddButton.setToolTipText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.versionAddButton.toolTipText")); // NOI18N versionAddButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { versionAddButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 8; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(versionAddButton, gridBagConstraints); assigneeLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.assigneeLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 6; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(assigneeLabel, gridBagConstraints); subjectLabel2.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.subjectLabel2.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(subjectLabel2, gridBagConstraints); assignToMeButton.setBorder(null); assignToMeButton.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.assignToMeButton.text")); // NOI18N assignToMeButton.setFont(new java.awt.Font("Lucida Grande", 0, 11)); // NOI18N assignToMeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { assignToMeButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 6; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(assignToMeButton, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 6; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(assigneeComboBox, gridBagConstraints); privateCheckBox.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.privateCheckBox.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 6; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(privateCheckBox, gridBagConstraints); descScrollPane.setMinimumSize(new java.awt.Dimension(22, 120)); descScrollPane.setPreferredSize(new java.awt.Dimension(223, 120)); descTextArea.setLineWrap(true); descScrollPane.setViewportView(descTextArea); descriptionPanel.addTab(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.descScrollPane.TabConstraints.tabTitle"), descScrollPane); // NOI18N descriptionPanel.addTab(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.htmlOutputLabel.TabConstraints.tabTitle"), htmlOutputLabel); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 6; gridBagConstraints.gridheight = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(descriptionPanel, gridBagConstraints); updateCommentLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.updateCommentLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 20; gridBagConstraints.gridwidth = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(updateCommentLabel, gridBagConstraints); updateCommentScrollPane1.setMinimumSize(new java.awt.Dimension(22, 80)); updateCommentScrollPane1.setPreferredSize(new java.awt.Dimension(228, 80)); updateCommentTextArea.setLineWrap(true); updateCommentScrollPane1.setViewportView(updateCommentTextArea); updateCommentTabPanel.addTab(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.updateCommentScrollPane1.TabConstraints.tabTitle"), updateCommentScrollPane1); // NOI18N updateCommentTabPanel.addTab(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.updateCommentHtmlOutputLabel.TabConstraints.tabTitle"), updateCommentHtmlOutputLabel); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 21; gridBagConstraints.gridwidth = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(updateCommentTabPanel, gridBagConstraints); attachmentLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.attachmentLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 19; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(attachmentLabel, gridBagConstraints); attachmentPanel.setOpaque(false); attachmentPanel.setLayout(new javax.swing.BoxLayout(attachmentPanel, javax.swing.BoxLayout.PAGE_AXIS)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 19; gridBagConstraints.gridwidth = 6; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(attachmentPanel, gridBagConstraints); logtimeLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.logtimeLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 22; gridBagConstraints.gridwidth = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(logtimeLabel, gridBagConstraints); logtimeInputPanel.setOpaque(false); logtimeInputPanel.setLayout(new java.awt.GridBagLayout()); logtimeSpentLabel.setFont(logtimeSpentLabel.getFont().deriveFont(logtimeSpentLabel.getFont().getStyle() | java.awt.Font.BOLD)); logtimeSpentLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.logtimeSpentLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); logtimeInputPanel.add(logtimeSpentLabel, gridBagConstraints); logtimeCommentLabel.setFont(logtimeCommentLabel.getFont().deriveFont(logtimeCommentLabel.getFont().getStyle() | java.awt.Font.BOLD)); logtimeCommentLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.logtimeCommentLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); logtimeInputPanel.add(logtimeCommentLabel, gridBagConstraints); logtimeActivityLabel.setFont(logtimeActivityLabel.getFont().deriveFont(logtimeActivityLabel.getFont().getStyle() | java.awt.Font.BOLD)); logtimeActivityLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.logtimeActivityLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); logtimeInputPanel.add(logtimeActivityLabel, gridBagConstraints); logtimeSpentTextField.setHorizontalAlignment(javax.swing.JTextField.RIGHT); logtimeSpentTextField.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.logtimeSpentTextField.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.ipadx = 50; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); logtimeInputPanel.add(logtimeSpentTextField, gridBagConstraints); logtimeCommentTextField.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.logtimeCommentTextField.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 4; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); logtimeInputPanel.add(logtimeCommentTextField, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; logtimeInputPanel.add(logtimeActivityComboBox, gridBagConstraints); logtimeSaveButton.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.logtimeSaveButton.text")); // NOI18N logtimeSaveButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { logtimeSaveButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 5; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); logtimeInputPanel.add(logtimeSaveButton, gridBagConstraints); logtimeHoursLabel.setFont(logtimeHoursLabel.getFont().deriveFont(logtimeHoursLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); logtimeHoursLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.logtimeHoursLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 12); logtimeInputPanel.add(logtimeHoursLabel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 23; gridBagConstraints.gridwidth = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(logtimeInputPanel, gridBagConstraints); spentHoursLabel.setText(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.spentHoursLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 5; gridBagConstraints.gridy = 8; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(spentHoursLabel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(startDateChooser, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 6; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(dueDateChooser, gridBagConstraints); projectComboBox.setRenderer(new com.kenai.redminenb.ui.Defaults.ProjectLCR()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.BASELINE_LEADING; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); issuePane.add(projectComboBox, gridBagConstraints); journalOuterPane.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(RedmineIssuePanel.class, "RedmineIssuePanel.journalOuterPane.border.title"))); // NOI18N journalOuterPane.setOpaque(false); journalOuterPane.setLayout(new java.awt.BorderLayout()); journalPane.setOpaque(false); journalPane.setLayout(new javax.swing.BoxLayout(journalPane, javax.swing.BoxLayout.PAGE_AXIS)); journalOuterPane.add(journalPane, java.awt.BorderLayout.CENTER); javax.swing.GroupLayout innerPanelLayout = new javax.swing.GroupLayout(innerPanel); innerPanel.setLayout(innerPanelLayout); innerPanelLayout.setHorizontalGroup( innerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(headPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(innerPanelLayout.createSequentialGroup() .addGroup(innerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(innerPanelLayout.createSequentialGroup() .addGap(12, 12, 12) .addComponent(buttonPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(innerPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(journalOuterPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(innerPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(issuePane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap()) ); innerPanelLayout.setVerticalGroup( innerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(innerPanelLayout.createSequentialGroup() .addComponent(headPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(issuePane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(8, 8, 8) .addComponent(journalOuterPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE)) ); add(innerPanel, java.awt.BorderLayout.PAGE_START); }// </editor-fold>//GEN-END:initComponents private void createButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_createButtonActionPerformed if (isIssueValid()) { createIssue(); } }//GEN-LAST:event_createButtonActionPerformed private void updateButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_updateButtonActionPerformed if (isIssueValid()) { saveIssue(); } }//GEN-LAST:event_updateButtonActionPerformed private void logtimeSaveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_logtimeSaveButtonActionPerformed String hoursString = logtimeSpentTextField.getText(); float hours; try { hours = NumberFormat.getNumberInstance().parse(logtimeSpentTextField.getText()) .floatValue(); } catch (ParseException ex) { setErrorMessage("Failed to parse '" + hoursString + "' as a float value"); return; } final TimeEntry te = TimeEntryFactory.create(); TimeEntryActivity tea = (TimeEntryActivity) logtimeActivityComboBox.getSelectedItem(); te.setActivityId(tea.getId()); te.setComment(logtimeCommentTextField.getText()); te.setHours(hours); te.setIssueId(getIssue().getIssue().getId()); new SwingWorker() { @Override protected Object doInBackground() throws Exception { try (SafeAutoCloseable sac = redmineIssue.busy()) { redmineIssue.getRepository().getTimeEntryManager().createTimeEntry(te); redmineIssue.refresh(); initIssue(); } return null; } @Override protected void done() { try { get(); setInfoMessage("Time entry successfully saved."); logtimeSpentTextField.setText(""); logtimeCommentTextField.setText(""); logtimePanel.colapse(); commentPanel.colapse(); } catch (InterruptedException ex) { Redmine.LOG.log(Level.INFO, "Saving time entry failed - Interrupted", ex); } catch (ExecutionException ex) { Exception src = (Exception) ex.getCause(); ExceptionHandler.handleException(LOG, "Saving time entry failed", src); setErrorMessage("Saving time entry failed: " + src.getMessage()); } } }.execute(); }//GEN-LAST:event_logtimeSaveButtonActionPerformed private void assignToMeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_assignToMeButtonActionPerformed assigneeComboBox.setSelectedItem(new AssigneeWrapper(redmineIssue.getRepository().getCurrentUser())); }//GEN-LAST:event_assignToMeButtonActionPerformed private void versionAddButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_versionAddButtonActionPerformed final NotifyDescriptor.InputLine d = new NotifyDescriptor.InputLine("New Version Name", "Add a new Version"); if (DialogDisplayer.getDefault().notify(d) == NotifyDescriptor.OK_OPTION && StringUtils.isNotBlank(d.getInputText())) { final NestedProject np = (NestedProject) projectComboBox.getSelectedItem(); assert np != null; redmineIssue.getRepository().getRequestProcessor().execute( new Runnable() { @Override public void run() { addVersion(np.getProject(), d.getInputText()); } } ); } }//GEN-LAST:event_versionAddButtonActionPerformed private void addVersion(Project proj, String versionName) { try (SafeAutoCloseable sac = redmineIssue.busy()) { Version v = VersionFactory.create(proj.getId(), versionName); redmineIssue.getRepository().getProjectManager().createVersion(v); final Collection<? extends Version> c = redmineIssue.getRepository().reloadVersions(proj); for (Version version : c) { if (v.getName().equals(version.getName())) { v = version; break; } } final Version selectedversion = v; Mutex.EVENT.writeAccess(new Mutex.Action<Void>() { @Override public Void run() { targetVersionComboBox.setModel(new DefaultComboBoxModel(c.toArray())); targetVersionComboBox.setSelectedItem(selectedversion); return null; } }); } catch (RedmineException | RuntimeException ex) { LOG.log(Level.WARNING, "Failed to create Version", ex); } } private void categoryAddButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_categoryAddButtonActionPerformed final NotifyDescriptor.InputLine d = new NotifyDescriptor.InputLine( "New Category label", "Add a new Category"); if (DialogDisplayer.getDefault().notify(d) == NotifyDescriptor.OK_OPTION && StringUtils.isNotBlank(d.getInputText())) { final NestedProject np = (NestedProject) projectComboBox.getSelectedItem(); assert np != null; redmineIssue.getRepository().getRequestProcessor().execute( new Runnable() { @Override public void run() { addCategory(np.getProject(), d.getInputText()); } } ); } }//GEN-LAST:event_categoryAddButtonActionPerformed private void addCategory(Project proj, String categoryName) { try (SafeAutoCloseable sac = redmineIssue.busy()) { IssueCategory ic = IssueCategoryFactory.create(proj.getId(), categoryName); redmineIssue.getRepository().getIssueManager().createCategory(ic); final Collection<? extends IssueCategory> c = redmineIssue.getRepository().reloadIssueCategories(proj); for (IssueCategory issueCategory : c) { if (ic.getName().equals(issueCategory.getName())) { ic = issueCategory; break; } } final IssueCategory selectedCategory = ic; Mutex.EVENT.writeAccess(new Mutex.Action<Void>() { @Override public Void run() { categoryComboBox.setModel(new DefaultComboBoxModel(c.toArray())); categoryComboBox.setSelectedItem(selectedCategory); return null; } }); } catch (RedmineException | RuntimeException ex) { LOG.log(Level.WARNING, "Failed to create category", ex); } } private void wikiSyntaxButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_wikiSyntaxButtonActionPerformed try { HtmlBrowser.URLDisplayer.getDefault().showURL(new URL( redmineIssue.getRepository().getUrl() + "/help/wiki_syntax.html")); } catch (MalformedURLException ex) { Exceptions.printStackTrace(ex); } }//GEN-LAST:event_wikiSyntaxButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables final com.kenai.redminenb.util.LinkButton assignToMeButton = new com.kenai.redminenb.util.LinkButton(); javax.swing.JComboBox assigneeComboBox; javax.swing.JLabel assigneeLabel; javax.swing.JLabel attachmentLabel; com.kenai.redminenb.util.DelegatingBaseLineJPanel attachmentPanel; javax.swing.JPanel buttonPane; final com.kenai.redminenb.util.LinkButton categoryAddButton = new com.kenai.redminenb.util.LinkButton(); javax.swing.JComboBox categoryComboBox; javax.swing.JLabel categoryLabel; javax.swing.JButton createButton; javax.swing.JLabel createdLabel; javax.swing.JLabel createdValueLabel; javax.swing.JScrollPane descScrollPane; javax.swing.JTextArea descTextArea; javax.swing.JLabel descriptionLabel; javax.swing.JTabbedPane descriptionPanel; javax.swing.JComboBox doneComboBox; javax.swing.JLabel doneLabel; org.jdesktop.swingx.JXDatePicker dueDateChooser; javax.swing.JLabel dueDateLabel; javax.swing.JLabel estimateTimeLabel; javax.swing.JLabel estimateTimeLabel1; javax.swing.JFormattedTextField estimateTimeTextField; javax.swing.Box.Filler filler1; javax.swing.JPanel headPane; javax.swing.JLabel headerLabel; com.kenai.redminenb.util.markup.TextilePreview htmlOutputLabel; final javax.swing.JLabel infoLabel = new javax.swing.JLabel(); javax.swing.JPanel innerPanel; javax.swing.JPanel issuePane; javax.swing.JPanel journalOuterPane; javax.swing.JPanel journalPane; javax.swing.JComboBox logtimeActivityComboBox; javax.swing.JLabel logtimeActivityLabel; javax.swing.JLabel logtimeCommentLabel; javax.swing.JTextField logtimeCommentTextField; javax.swing.JLabel logtimeHoursLabel; javax.swing.JPanel logtimeInputPanel; javax.swing.JLabel logtimeLabel; javax.swing.JButton logtimeSaveButton; javax.swing.JLabel logtimeSpentLabel; javax.swing.JTextField logtimeSpentTextField; javax.swing.JPanel parentHeaderPanel; javax.swing.JLabel parentIdLabel; javax.swing.JFormattedTextField parentTaskTextField; javax.swing.JComboBox priorityComboBox; javax.swing.JLabel priorityLabel; javax.swing.JCheckBox privateCheckBox; javax.swing.JComboBox projectComboBox; javax.swing.JLabel spentHoursLabel; org.jdesktop.swingx.JXDatePicker startDateChooser; javax.swing.JLabel startDateLabel; javax.swing.JComboBox statusComboBox; javax.swing.JLabel statusLabel; javax.swing.JLabel subjectLabel; javax.swing.JLabel subjectLabel1; javax.swing.JLabel subjectLabel2; javax.swing.JTextField subjectTextField; javax.swing.JComboBox targetVersionComboBox; javax.swing.JLabel targetVersionLabel; org.openide.awt.Toolbar toolbar; javax.swing.JComboBox trackerComboBox; javax.swing.JButton updateButton; com.kenai.redminenb.util.markup.TextilePreview updateCommentHtmlOutputLabel; javax.swing.JLabel updateCommentLabel; javax.swing.JScrollPane updateCommentScrollPane1; javax.swing.JTabbedPane updateCommentTabPanel; javax.swing.JTextArea updateCommentTextArea; javax.swing.JLabel updatedLabel; javax.swing.JLabel updatedValueLabel; final com.kenai.redminenb.util.LinkButton versionAddButton = new com.kenai.redminenb.util.LinkButton(); final com.kenai.redminenb.util.LinkButton wikiSyntaxButton = new com.kenai.redminenb.util.LinkButton(); // End of variables declaration//GEN-END:variables }