This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 165694
Collapse All | Expand All

(-)df2f526ba7ed (+167 lines)
Added Link Here
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
5
 *
6
 * The contents of this file are subject to the terms of either the GNU
7
 * General Public License Version 2 only ("GPL") or the Common
8
 * Development and Distribution License("CDDL") (collectively, the
9
 * "License"). You may not use this file except in compliance with the
10
 * License. You can obtain a copy of the License at
11
 * http://www.netbeans.org/cddl-gplv2.html
12
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
13
 * specific language governing permissions and limitations under the
14
 * License.  When distributing the software, include this License Header
15
 * Notice in each file and include the License file at
16
 * nbbuild/licenses/CDDL-GPL-2-CP.  Sun designates this
17
 * particular file as subject to the "Classpath" exception as provided
18
 * by Sun in the GPL Version 2 section of the License file that
19
 * accompanied this code. If applicable, add the following below the
20
 * License Header, with the fields enclosed by brackets [] replaced by
21
 * your own identifying information:
22
 * "Portions Copyrighted [year] [name of copyright owner]"
23
 *
24
 * If you wish your version of this file to be governed by only the CDDL
25
 * or only the GPL Version 2, indicate your decision by adding
26
 * "[Contributor] elects to include this software in this distribution
27
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
28
 * single choice of license, a recipient has the option to distribute
29
 * your version of this file under either the CDDL, the GPL Version 2 or
30
 * to extend the choice of license to its licensees as provided above.
31
 * However, if you add GPL Version 2 code and therefore, elected the GPL
32
 * Version 2 license, then the option applies only if the new code is
33
 * made subject to such option by the copyright holder.
34
 *
35
 * Contributor(s):
36
 *
37
 * Portions Copyrighted 2009 Sun Microsystems, Inc.
38
 */
39
40
package org.netbeans.modules.bugtracking.vcs;
41
42
import java.awt.EventQueue;
43
import java.awt.event.HierarchyEvent;
44
import java.awt.event.HierarchyListener;
45
import java.io.File;
46
import java.util.logging.Logger;
47
import org.netbeans.modules.bugtracking.spi.Repository;
48
import org.netbeans.modules.bugtracking.util.BugtrackingOwnerSupport;
49
import org.openide.util.Exceptions;
50
import org.openide.util.RequestProcessor;
51
import static java.util.logging.Level.FINEST;
52
53
/**
54
 * Determines the default issue tracking repository for the
55
 * {@code HookPanel} and selects it in the panel's combo-box.
56
 * It is activated by method {@code hierarchyChanged} when the hook panel
57
 * is displayed. At this moment, a routine for finding the default
58
 * repository is started in a separated thread. Once the routine finishes,
59
 * the determined default repository is selected in the repository
60
 * combo-box in the {@code HookPanel}, unless the user has already selected
61
 * one.
62
 *
63
 * @author  Marian Petras
64
 */
65
final class DefaultRepositorySelector implements HierarchyListener, Runnable {
66
67
    private static final Logger LOG
68
            = Logger.getLogger(DefaultRepositorySelector.class.getName());
69
70
    private final HookPanel hookPanel;
71
    private final File refFile;
72
    private boolean tooLate;
73
    private transient Repository defaultRepo;
74
75
    static void setup(HookPanel hookPanel, File referenceFile) {
76
        hookPanel.addHierarchyListener(
77
                new DefaultRepositorySelector(hookPanel, referenceFile));
78
    }
79
80
    private DefaultRepositorySelector(HookPanel hookPanel, File refFile) {
81
        super();
82
        this.hookPanel = hookPanel;
83
        this.refFile = refFile;
84
    }
85
86
    public void hierarchyChanged(HierarchyEvent e) {
87
        if ((e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0) {
88
            assert e.getChanged() == hookPanel;
89
            if (hookPanel.isDisplayable()) {
90
                hookPanelDisplayed();
91
            } else {
92
                hookPanelClosed();
93
            }
94
        }
95
    }
96
97
    private void hookPanelDisplayed() {
98
        RequestProcessor.getDefault().post(this);
99
    }
100
101
    private void hookPanelClosed() {
102
        /*
103
         * The panel had been closed sooner than the default repository has been
104
         * determined.
105
         */
106
        tooLate = true;
107
        hookPanel.removeHierarchyListener(this);
108
    }
109
110
    public void run() {
111
        if (RequestProcessor.getDefault().isRequestProcessorThread()) {
112
            findDefaultRepository();
113
        } else {
114
            assert EventQueue.isDispatchThread();
115
116
            LOG.finest("run() called from AWT - going to select the repository"); //NOI18N
117
118
            if (tooLate) {
119
                LOG.finest(" - too late - the HookPanel has been already closed"); //NOI18N
120
                return;
121
            }
122
123
            hookPanel.removeHierarchyListener(this);
124
125
            if (defaultRepo == null) {
126
                LOG.finest(" - default repository not determined - abort"); //NOI18N
127
                return;
128
            }
129
130
            hookPanel.preselectRepository(defaultRepo);
131
        }
132
    }
133
134
    private void findDefaultRepository() {
135
        assert RequestProcessor.getDefault().isRequestProcessorThread();
136
        long startTimeMillis, endTimeMillis;
137
        Repository result;
138
139
        startTimeMillis = System.currentTimeMillis();
140
        if (refFile != null) {
141
            result = BugtrackingOwnerSupport.getInstance()
142
                     .getRepository(refFile, false);
143
            if ((result == null) && LOG.isLoggable(FINEST)) {
144
                LOG.finest(" could not find issue tracker for " + refFile); //NOI18N
145
            }
146
        } else {
147
            result = BugtrackingOwnerSupport.getInstance()
148
                    .getRepository(BugtrackingOwnerSupport.ContextType.ALL_PROJECTS);
149
        }
150
        endTimeMillis = System.currentTimeMillis();
151
152
        if (LOG.isLoggable(FINEST)) {
153
            LOG.finest("BugtrackingOwnerSupport.getRepository(...) took " //NOI18N
154
                       + (endTimeMillis - startTimeMillis) + " ms.");   //NOI18N
155
        }
156
157
        if (result != null) {
158
            if (LOG.isLoggable(FINEST)) {
159
                LOG.finest(" - default repository: " + result.getDisplayName()); //NOI18N
160
            }
161
            defaultRepo = result;
162
            EventQueue.invokeLater(this);
163
        } else {
164
            LOG.finest(" - default repository: <null>");                //NOI18N
165
        }
166
    }
167
}
(-)a/bugtracking.bridge/src/org/netbeans/modules/bugtracking/vcs/HgHookImpl.java (-11 / +17 lines)
Lines 233-253 Link Here
233
233
234
    @Override
234
    @Override
235
    public JPanel createComponent(HgHookContext context) {
235
    public JPanel createComponent(HgHookContext context) {
236
        Repository[] repos = BugtrackingUtil.getKnownRepositories();
236
        File referenceFile;
237
        if(context.getFiles().length == 0) {
237
        if(context.getFiles().length == 0) {
238
            referenceFile = null;
238
            LOG.warning("creating hg hook component for zero files");           // NOI18N
239
            LOG.warning("creating hg hook component for zero files");           // NOI18N
239
            Repository repoToSelect
240
                    = BugtrackingOwnerSupport.getInstance()
241
                      .getRepository(BugtrackingOwnerSupport.ContextType.ALL_PROJECTS);
242
            panel = new HookPanel(repos, repoToSelect);
243
        } else {
240
        } else {
244
            File file = context.getFiles()[0];
241
            referenceFile = context.getFiles()[0];
245
            Repository repoToSelect = BugtrackingOwnerSupport.getInstance().getRepository(file, false);
246
            if(repoToSelect == null) {
247
                LOG.log(Level.FINE, " could not find issue tracker for " + file);  // NOI18N
248
            }
249
            panel = new HookPanel(repos, repoToSelect);
250
        }
242
        }
243
        panel = new HookPanel(getKnownRepositories());
244
        DefaultRepositorySelector.setup(panel, referenceFile);
251
        panel.changeRevisionFormatButton.addActionListener(new ActionListener() {
245
        panel.changeRevisionFormatButton.addActionListener(new ActionListener() {
252
            public void actionPerformed(ActionEvent e) {
246
            public void actionPerformed(ActionEvent e) {
253
                onShowRevisionFormat();
247
                onShowRevisionFormat();
Lines 261-266 Link Here
261
        return panel;
255
        return panel;
262
    }
256
    }
263
257
258
    private static Repository[] getKnownRepositories() {
259
        Repository[] repos;
260
        long startTimeMillis = System.currentTimeMillis();
261
        repos = BugtrackingUtil.getKnownRepositories();
262
        long endTimeMillis = System.currentTimeMillis();
263
        if (LOG.isLoggable(Level.FINEST)) {
264
            LOG.finest("BugtrackingUtil.getKnownRepositories() took "   //NOI18N
265
                       + (endTimeMillis - startTimeMillis) + " ms.");   //NOI18N
266
        }
267
        return repos;
268
    }
269
264
    @Override
270
    @Override
265
    public String getDisplayName() {
271
    public String getDisplayName() {
266
        return name;
272
        return name;
(-)a/bugtracking.bridge/src/org/netbeans/modules/bugtracking/vcs/HookPanel.java (-12 / +82 lines)
Lines 48-72 Link Here
48
import java.awt.BorderLayout;
48
import java.awt.BorderLayout;
49
import java.awt.Component;
49
import java.awt.Component;
50
import java.awt.Dimension;
50
import java.awt.Dimension;
51
import java.awt.EventQueue;
51
import java.awt.event.ItemEvent;
52
import java.awt.event.ItemEvent;
52
import java.awt.event.ItemListener;
53
import java.awt.event.ItemListener;
53
import java.beans.PropertyChangeEvent;
54
import java.beans.PropertyChangeEvent;
54
import java.beans.PropertyChangeListener;
55
import java.beans.PropertyChangeListener;
56
import java.util.logging.Logger;
55
import javax.swing.DefaultComboBoxModel;
57
import javax.swing.DefaultComboBoxModel;
56
import javax.swing.DefaultListCellRenderer;
58
import javax.swing.DefaultListCellRenderer;
57
import javax.swing.JButton;
59
import javax.swing.JButton;
58
import javax.swing.JList;
60
import javax.swing.JList;
61
import javax.swing.event.PopupMenuEvent;
62
import javax.swing.event.PopupMenuListener;
59
import org.netbeans.modules.bugtracking.ui.search.QuickSearchComboBar;
63
import org.netbeans.modules.bugtracking.ui.search.QuickSearchComboBar;
60
import org.netbeans.modules.bugtracking.spi.Issue;
64
import org.netbeans.modules.bugtracking.spi.Issue;
61
import org.netbeans.modules.bugtracking.spi.Repository;
65
import org.netbeans.modules.bugtracking.spi.Repository;
62
import org.netbeans.modules.bugtracking.util.BugtrackingUtil;
66
import org.netbeans.modules.bugtracking.util.BugtrackingUtil;
63
import org.netbeans.modules.versioning.util.VerticallyNonResizingPanel;
67
import org.netbeans.modules.versioning.util.VerticallyNonResizingPanel;
68
import static java.util.logging.Level.FINER;
64
69
65
/**
70
/**
66
 *
71
 *
67
 * @author Tomas Stupka
72
 * @author Tomas Stupka
68
 */
73
 */
69
public class HookPanel extends VerticallyNonResizingPanel implements ItemListener, PropertyChangeListener {
74
public class HookPanel extends VerticallyNonResizingPanel implements ItemListener, PropertyChangeListener {
75
76
    private static Logger LOG = Logger.getLogger("org.netbeans.modules.bugtracking.vcshooks.HookPanel");  // NOI18N
77
70
    private QuickSearchComboBar qs;
78
    private QuickSearchComboBar qs;
71
    private Repository selectedRepository;
79
    private Repository selectedRepository;
72
80
Lines 98-111 Link Here
98
    }
106
    }
99
    private UpdateFiledsState updateFiledsState = null;
107
    private UpdateFiledsState updateFiledsState = null;
100
    
108
    
101
    public HookPanel(Repository[] repos, Repository toSelect) {
109
    public HookPanel(Repository[] repos) {
102
        initComponents();
110
        initComponents();
103
111
104
        qs = new QuickSearchComboBar(this);
112
        qs = new QuickSearchComboBar(this);
105
        issuePanel.add(qs, BorderLayout.NORTH);
113
        issuePanel.add(qs, BorderLayout.NORTH);
106
        issueLabel.setLabelFor(qs.getCommand());
114
        issueLabel.setLabelFor(qs.getCommand());
115
116
        Repository[] comboData;
117
        if (repos == null) {
118
            comboData = new Repository[1];
119
            comboData[0] = null;
120
        } else {
121
            comboData = new Repository[repos.length + 1];
122
            comboData[0] = null;
123
            if (repos.length != 0) {
124
                System.arraycopy(repos, 0, comboData, 1, repos.length);
125
            }
126
        }
107
        
127
        
108
        repositoryComboBox.setModel(new DefaultComboBoxModel(repos != null ? repos : new Repository[0]));
128
        repositoryComboBox.setModel(new DefaultComboBoxModel(comboData));
109
        repositoryComboBox.setRenderer(new DefaultListCellRenderer() {
129
        repositoryComboBox.setRenderer(new DefaultListCellRenderer() {
110
            @Override
130
            @Override
111
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
131
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Lines 118-135 Link Here
118
        });
138
        });
119
139
120
        repositoryComboBox.addItemListener(this);
140
        repositoryComboBox.addItemListener(this);
121
        if(toSelect != null) {
141
        enableFields();        
122
            repositoryComboBox.setSelectedItem(toSelect);
142
    }
123
            qs.setRepository(toSelect);
143
144
    /**
145
     * Selects the given repository in the combo-box if no repository has been
146
     * selected yet by the user.
147
     * If the user had already selected some repository before this method
148
     * was called, this method does nothing. If this method is called at
149
     * the moment the popup of the combo-box is opened, the operation of
150
     * pre-selecting the repository is deferred until the popup is closed. If
151
     * the popup had been displayed at the moment this method was called
152
     * and the user selects some repository during the period since the
153
     * call of this method until the deferred selection takes place, the
154
     * deferred selection operation is cancelled.
155
     * 
156
     * @param  repoToPreselect  repository to preselect
157
     */
158
    void preselectRepository(final Repository repoToPreselect) {
159
        assert EventQueue.isDispatchThread();
160
161
        if (repoToPreselect == null) {
162
            LOG.finer("preselectRepository(null)");                     //NOI18N
163
            return;
164
        }
165
166
        if (LOG.isLoggable(FINER)) {
167
            LOG.finer("preselectRepository(" + repoToPreselect.getDisplayName() + ')'); //NOI18N
168
        }
169
170
        if (repositoryComboBox.getSelectedItem() != null) {
171
            LOG.finest(" - cancelled - already selected by the user");  //NOI18N
172
            return;
173
        }
174
175
        if (repositoryComboBox.isPopupVisible()) {
176
            LOG.finest(" - the popup is visible - deferred");           //NOI18N
177
            repositoryComboBox.addPopupMenuListener(new PopupMenuListener() {
178
                public void popupMenuWillBecomeVisible(PopupMenuEvent e) { }
179
                public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
180
                    LOG.finer("popupMenuWillBecomeInvisible()");        //NOI18N
181
                    repositoryComboBox.removePopupMenuListener(this);
182
                }
183
                public void popupMenuCanceled(PopupMenuEvent e) {
184
                    LOG.finer("popupMenuCanceled()");                   //NOI18N
185
                    repositoryComboBox.removePopupMenuListener(this);
186
                    LOG.finest(" - processing deferred selection");     //NOI18N
187
                    preselectRepositoryUnconditionally(repoToPreselect);
188
                }
189
            });
124
        } else {
190
        } else {
125
            if(repositoryComboBox.getItemCount() > 0) {
191
            preselectRepositoryUnconditionally(repoToPreselect);
126
                Repository repo = (Repository) repositoryComboBox.getItemAt(0);
127
                repositoryComboBox.setSelectedItem(repo);
128
                qs.setRepository(repo);
129
            }
130
        }
192
        }
131
        enableFields();        
193
    }
132
        
194
195
    private void preselectRepositoryUnconditionally(Repository repoToPreselect) {
196
        assert repositoryComboBox.getSelectedItem() == null;
197
198
        if (LOG.isLoggable(FINER)) {
199
            LOG.finer("preselectRepositoryUnconditionally(" + repoToPreselect.getDisplayName() + ')'); //NOI18N
200
        }
201
202
        repositoryComboBox.setSelectedItem(repoToPreselect);
133
    }
203
    }
134
204
135
    Issue getIssue() {
205
    Issue getIssue() {
(-)a/bugtracking.bridge/src/org/netbeans/modules/bugtracking/vcs/SvnHookImpl.java (-11 / +17 lines)
Lines 199-219 Link Here
199
199
200
    @Override
200
    @Override
201
    public JPanel createComponent(SvnHookContext context) {
201
    public JPanel createComponent(SvnHookContext context) {
202
        Repository[] repos = BugtrackingUtil.getKnownRepositories();
202
        File referenceFile;
203
        if(context.getFiles().length == 0) {
203
        if(context.getFiles().length == 0) {
204
            referenceFile = null;
204
            LOG.warning("creating svn hook component for zero files");          // NOI18N
205
            LOG.warning("creating svn hook component for zero files");          // NOI18N
205
            Repository repoToSelect
206
                    = BugtrackingOwnerSupport.getInstance()
207
                      .getRepository(BugtrackingOwnerSupport.ContextType.ALL_PROJECTS);
208
            panel = new HookPanel(repos, repoToSelect);
209
        } else {
206
        } else {
210
            File file = context.getFiles()[0];
207
            referenceFile = context.getFiles()[0];
211
            Repository repoToSelect = BugtrackingOwnerSupport.getInstance().getRepository(file, false);
212
            if(repoToSelect == null) {
213
                LOG.log(Level.FINE, " could not find issue tracker for " + file);  // NOI18N
214
            }
215
            panel = new HookPanel(repos, repoToSelect);
216
        }
208
        }
209
        panel = new HookPanel(getKnownRepositories());
210
        DefaultRepositorySelector.setup(panel, referenceFile);
217
        panel.commitRadioButton.setVisible(false);
211
        panel.commitRadioButton.setVisible(false);
218
        panel.pushRadioButton.setVisible(false);
212
        panel.pushRadioButton.setVisible(false);
219
        panel.changeRevisionFormatButton.addActionListener(new ActionListener() {
213
        panel.changeRevisionFormatButton.addActionListener(new ActionListener() {
Lines 229-234 Link Here
229
        return panel;
223
        return panel;
230
    }
224
    }
231
225
226
    private static Repository[] getKnownRepositories() {
227
        Repository[] repos;
228
        long startTimeMillis = System.currentTimeMillis();
229
        repos = BugtrackingUtil.getKnownRepositories();
230
        long endTimeMillis = System.currentTimeMillis();
231
        if (LOG.isLoggable(Level.FINEST)) {
232
            LOG.finest("BugtrackingUtil.getKnownRepositories() took "   //NOI18N
233
                       + (endTimeMillis - startTimeMillis) + " ms.");   //NOI18N
234
        }
235
        return repos;
236
    }
237
232
    @Override
238
    @Override
233
    public String getDisplayName() {
239
    public String getDisplayName() {
234
        return name;
240
        return name;

Return to bug 165694