001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.subversion.ui.repository;
043:
044: import java.awt.BorderLayout;
045: import java.awt.Component;
046: import java.awt.Dialog;
047: import java.awt.Dimension;
048: import java.awt.event.ActionEvent;
049: import java.awt.event.ActionListener;
050: import java.awt.event.FocusEvent;
051: import java.awt.event.FocusListener;
052: import java.awt.event.ItemEvent;
053: import java.awt.event.ItemListener;
054: import java.beans.PropertyChangeEvent;
055: import java.beans.PropertyChangeListener;
056: import java.lang.reflect.InvocationTargetException;
057: import java.net.MalformedURLException;
058: import java.text.MessageFormat;
059: import java.util.ArrayList;
060: import java.util.Iterator;
061: import java.util.LinkedHashSet;
062: import java.util.List;
063: import java.util.Set;
064: import java.util.Vector;
065: import java.util.logging.Level;
066: import javax.swing.ComboBoxModel;
067: import javax.swing.DefaultComboBoxModel;
068: import javax.swing.JPanel;
069: import javax.swing.SwingUtilities;
070: import javax.swing.event.DocumentEvent;
071: import javax.swing.event.DocumentListener;
072: import javax.swing.text.JTextComponent;
073: import org.netbeans.api.options.OptionsDisplayer;
074: import org.netbeans.modules.subversion.Subversion;
075: import org.netbeans.modules.subversion.SvnModuleConfig;
076: import org.netbeans.modules.subversion.config.SvnConfigFiles;
077: import org.netbeans.modules.subversion.util.SvnUtils;
078: import org.openide.DialogDescriptor;
079: import org.openide.DialogDisplayer;
080: import org.openide.util.HelpCtx;
081: import org.openide.util.NbBundle;
082: import org.tigris.subversion.svnclientadapter.SVNRevision;
083: import org.tigris.subversion.svnclientadapter.SVNUrl;
084:
085: /**
086: * @author Tomas Stupka
087: */
088: public class Repository implements ActionListener, DocumentListener,
089: FocusListener, ItemListener {
090:
091: public final static int FLAG_URL_EDITABLE = 2;
092: public final static int FLAG_URL_ENABLED = 4;
093: public final static int FLAG_ACCEPT_REVISION = 8;
094: public final static int FLAG_SHOW_REMOVE = 16;
095: public final static int FLAG_SHOW_HINTS = 32;
096: public final static int FLAG_SHOW_PROXY = 64;
097:
098: private final static String LOCAL_URL_HELP = "file:///repository_path[@REV]"; // NOI18N
099: private final static String HTTP_URL_HELP = "http://hostname/repository_path[@REV]"; // NOI18N
100: private final static String HTTPS_URL_HELP = "https://hostname/repository_path[@REV]"; // NOI18N
101: private final static String SVN_URL_HELP = "svn://hostname/repository_path[@REV]"; // NOI18N
102: private final static String SVN_SSH_URL_HELP = "svn+{0}://hostname/repository_path[@REV]"; // NOI18N
103:
104: private RepositoryPanel repositoryPanel;
105: private boolean valid = true;
106: private List<PropertyChangeListener> listeners;
107:
108: private RepositoryConnection editedRC;
109:
110: public static final String PROP_VALID = "valid"; // NOI18N
111:
112: private String message;
113: private int modeMask;
114: private Dimension maxNeededSize;
115:
116: public Repository(String titleLabel) {
117: this (0, titleLabel);
118: }
119:
120: public Repository(int modeMask, String titleLabel) {
121:
122: this .modeMask = modeMask;
123:
124: initPanel();
125:
126: repositoryPanel.titleLabel.setText(titleLabel);
127:
128: repositoryPanel.urlComboBox
129: .setEditable(isSet(FLAG_URL_EDITABLE));
130: repositoryPanel.urlComboBox.setEnabled(isSet(FLAG_URL_ENABLED));
131: repositoryPanel.tunnelHelpLabel
132: .setVisible(isSet(FLAG_SHOW_HINTS));
133: repositoryPanel.tipLabel.setVisible(isSet(FLAG_SHOW_HINTS));
134: repositoryPanel.removeButton
135: .setVisible(isSet(FLAG_SHOW_REMOVE));
136:
137: // retrieve the dialog size for the largest configuration
138: updateVisibility("svn+"); // NOI18N
139: maxNeededSize = repositoryPanel.getPreferredSize();
140:
141: repositoryPanel.savePasswordCheckBox
142: .setSelected(SvnModuleConfig.getDefault()
143: .getSavePassword());
144: refreshUrlHistory();
145: }
146:
147: public void selectUrl(SVNUrl url, boolean force) {
148: DefaultComboBoxModel dcbm = (DefaultComboBoxModel) repositoryPanel.urlComboBox
149: .getModel();
150: int idx = dcbm.getIndexOf(url.toString());
151: if (idx > -1) {
152: dcbm.setSelectedItem(url.toString());
153: } else if (force) {
154: RepositoryConnection rc = new RepositoryConnection(url
155: .toString());
156: dcbm.addElement(rc);
157: dcbm.setSelectedItem(rc);
158: }
159: }
160:
161: public void actionPerformed(ActionEvent e) {
162: if (e.getSource() == repositoryPanel.proxySettingsButton) {
163: onProxyConfiguration();
164: } else if (e.getSource() == repositoryPanel.removeButton) {
165: onRemoveClick();
166: } else if (e.getSource() == repositoryPanel.savePasswordCheckBox) {
167: onSavePasswordChange();
168: }
169: }
170:
171: private void onProxyConfiguration() {
172: OptionsDisplayer.getDefault().open("General"); // NOI18N
173: }
174:
175: private void initPanel() {
176: repositoryPanel = new RepositoryPanel();
177:
178: repositoryPanel.proxySettingsButton.addActionListener(this );
179: repositoryPanel.removeButton.addActionListener(this );
180:
181: repositoryPanel.urlComboBox.addActionListener(this );
182: getUrlComboEditor().getDocument().addDocumentListener(this );
183:
184: repositoryPanel.userPasswordField.getDocument()
185: .addDocumentListener(this );
186: repositoryPanel.userPasswordField.addFocusListener(this );
187:
188: repositoryPanel.userTextField.getDocument()
189: .addDocumentListener(this );
190: repositoryPanel.tunnelCommandTextField.getDocument()
191: .addDocumentListener(this );
192: repositoryPanel.savePasswordCheckBox.addActionListener(this );
193:
194: repositoryPanel.urlComboBox.addItemListener(this );
195:
196: onSelectedRepositoryChange();
197: }
198:
199: public void refreshUrlHistory() {
200:
201: List<RepositoryConnection> recentUrls = SvnModuleConfig
202: .getDefault().getRecentUrls();
203:
204: Set<RepositoryConnection> recentRoots = new LinkedHashSet<RepositoryConnection>();
205: recentRoots.addAll(recentUrls);
206:
207: if (repositoryPanel.urlComboBox.isEditable()) {
208: // templates for supported connection methods
209: recentRoots.add(new RepositoryConnection("file:///")); // NOI18N
210: recentRoots.add(new RepositoryConnection("http://")); // NOI18N
211: recentRoots.add(new RepositoryConnection("https://")); // NOI18N
212: recentRoots.add(new RepositoryConnection("svn://")); // NOI18N
213: recentRoots.add(new RepositoryConnection("svn+ssh://")); // NOI18N
214: }
215: ;
216:
217: ComboBoxModel rootsModel = new RepositoryModel(
218: new Vector<RepositoryConnection>(recentRoots));
219: repositoryPanel.urlComboBox.setModel(rootsModel);
220:
221: if (recentRoots.size() > 0) {
222: repositoryPanel.urlComboBox.setSelectedIndex(0);
223: refresh(getSelectedRC());
224: }
225:
226: if (repositoryPanel.urlComboBox.isEditable()) {
227: JTextComponent textEditor = getUrlComboEditor();
228: textEditor.selectAll();
229: }
230: updateVisibility();
231: }
232:
233: public void storeRecentUrls() {
234: SvnModuleConfig.getDefault().setRecentUrls(getRecentUrls());
235: }
236:
237: public boolean isChanged() {
238: List<RepositoryConnection> connections = getRecentUrls();
239: List<RepositoryConnection> storedConnections = SvnModuleConfig
240: .getDefault().getRecentUrls();
241: return !SvnUtils.equals(connections, storedConnections);
242: }
243:
244: private List<RepositoryConnection> getRecentUrls() {
245: ComboBoxModel model = repositoryPanel.urlComboBox.getModel();
246: List<RepositoryConnection> ret = new ArrayList<RepositoryConnection>(
247: model.getSize());
248: for (int i = 0; i < model.getSize(); i++) {
249: ret.add((RepositoryConnection) model.getElementAt(i));
250: }
251: return ret;
252: }
253:
254: private JTextComponent getUrlComboEditor() {
255: Component editor = repositoryPanel.urlComboBox.getEditor()
256: .getEditorComponent();
257: JTextComponent textEditor = (JTextComponent) editor;
258: return textEditor;
259: }
260:
261: public void setEditable(boolean editable) {
262: repositoryPanel.urlComboBox.setEditable(editable);
263: repositoryPanel.userPasswordField.setEditable(editable);
264: repositoryPanel.userTextField.setEditable(editable);
265: repositoryPanel.proxySettingsButton.setEnabled(editable);
266: repositoryPanel.savePasswordCheckBox.setEnabled(editable);
267: }
268:
269: public void storeConfigValues() {
270: RepositoryConnection rc = getSelectedRC();
271: if (rc == null) {
272: return; // uups
273: }
274:
275: try {
276: SVNUrl repositoryUrl = rc.getSvnUrl();
277: if (repositoryUrl.getProtocol().startsWith("svn+")) {
278: SvnConfigFiles.getInstance().setExternalCommand(
279: getTunnelName(repositoryUrl.getProtocol()),
280: repositoryPanel.tunnelCommandTextField
281: .getText());
282: }
283: } catch (MalformedURLException mue) {
284: // should not happen
285: Subversion.LOG.log(Level.INFO, null, mue);
286: }
287:
288: }
289:
290: public void insertUpdate(DocumentEvent e) {
291: textChanged(e);
292: }
293:
294: public void removeUpdate(DocumentEvent e) {
295: textChanged(e);
296: }
297:
298: public void changedUpdate(DocumentEvent e) {
299: textChanged(e);
300: }
301:
302: private void textChanged(final DocumentEvent e) {
303: // repost later to AWT otherwise it can deadlock because
304: // the document is locked while firing event and we try
305: // synchronously access its content from selected repository
306: Runnable awt = new Runnable() {
307: public void run() {
308: if (e.getDocument() == repositoryPanel.userTextField
309: .getDocument()) {
310: onUsernameChange();
311: } else if (e.getDocument() == repositoryPanel.userPasswordField
312: .getDocument()) {
313: onPasswordChange();
314: } else if (e.getDocument() == ((JTextComponent) repositoryPanel.urlComboBox
315: .getEditor().getEditorComponent())
316: .getDocument()) {
317: onSelectedRepositoryChange();
318: } else if (e.getDocument() == (repositoryPanel.tunnelCommandTextField
319: .getDocument())) {
320: onTunnelCommandChange();
321: }
322: validateSvnUrl();
323: }
324: };
325: SwingUtilities.invokeLater(awt);
326: }
327:
328: /**
329: * Fast url syntax check. It can invalidate the whole step
330: */
331: private void validateSvnUrl() {
332: boolean valid = true;
333:
334: RepositoryConnection rc = null;
335: try {
336: rc = getSelectedRC();
337: // check for a valid svnurl
338: rc.getSvnUrl();
339: if (!isSet(FLAG_ACCEPT_REVISION)
340: && !rc.getSvnRevision().equals(SVNRevision.HEAD)) {
341: message = NbBundle.getMessage(Repository.class,
342: "MSG_Repository_OnlyHEADRevision");
343: valid = false;
344: } else {
345: // check for a valid svnrevision
346: rc.getSvnRevision();
347: }
348: } catch (Exception ex) {
349: message = ex.getLocalizedMessage();
350: valid = false;
351: }
352:
353: if (valid) {
354: valid = rc != null && !rc.getUrl().equals("");
355: if (rc.getUrl().startsWith("svn+")
356: && repositoryPanel.tunnelCommandTextField.getText()
357: .trim().equals("")) {
358: valid = false;
359: }
360: }
361:
362: setValid(valid, message);
363: repositoryPanel.proxySettingsButton.setEnabled(valid);
364: repositoryPanel.userPasswordField.setEnabled(valid);
365: repositoryPanel.userTextField.setEnabled(valid);
366: repositoryPanel.savePasswordCheckBox.setEnabled(valid);
367:
368: repositoryPanel.removeButton.setEnabled(rc != null
369: && rc.getUrl().length() > 0);
370: }
371:
372: /**
373: * Always updates UI fields visibility.
374: */
375: private void onSelectedRepositoryChange() {
376: setValid(true, ""); // NOI18N
377: String urlString = ""; // NOI18N
378: try {
379: urlString = getUrlString();
380: } catch (InterruptedException ex) {
381: return; // should not happen
382: }
383:
384: if (urlString != null) {
385:
386: RepositoryConnection editedrc = getEditedRC();
387: editedrc.setUrl(urlString);
388:
389: DefaultComboBoxModel dcbm = (DefaultComboBoxModel) repositoryPanel.urlComboBox
390: .getModel();
391: int idx = dcbm.getIndexOf(editedrc);
392: if (idx > -1) {
393: //dcbm.setSelectedItem(urlString);
394: refresh((RepositoryConnection) dcbm.getElementAt(idx));
395: }
396: if (urlString.startsWith("svn+")) {
397: String tunnelName = getTunnelName(urlString).trim();
398: if (repositoryPanel.tunnelCommandTextField.getText()
399: .trim().equals("")
400: && tunnelName != null && !tunnelName.equals("")) {
401: repositoryPanel.tunnelCommandTextField
402: .setText(SvnConfigFiles.getInstance()
403: .getExternalCommand(tunnelName));
404: }
405: }
406:
407: editedrc.setUsername(repositoryPanel.userTextField
408: .getText());
409: editedrc.setPassword(new String(
410: repositoryPanel.userPasswordField.getPassword()));
411: editedrc
412: .setExternalCommand(repositoryPanel.tunnelCommandTextField
413: .getText());
414: editedrc
415: .setSavePassword(repositoryPanel.savePasswordCheckBox
416: .isSelected());
417: }
418: message = ""; // NOI18N
419: updateVisibility();
420: }
421:
422: private RepositoryConnection getEditedRC() {
423: if (editedRC == null) {
424: editedRC = new RepositoryConnection("");
425: }
426: return editedRC;
427: }
428:
429: private void updateVisibility() {
430: try {
431: updateVisibility(getUrlString());
432: } catch (InterruptedException ex) {
433: return;
434: }
435: }
436:
437: /** Shows proper fields depending on Svn connection method. */
438: private void updateVisibility(String selectedUrlString) {
439:
440: boolean authFields = false;
441: boolean proxyFields = false;
442: boolean sshFields = false;
443: if (selectedUrlString.startsWith("http:")) { // NOI18N
444: repositoryPanel.tipLabel.setText(HTTP_URL_HELP);
445: authFields = true;
446: proxyFields = true;
447: } else if (selectedUrlString.startsWith("https:")) { // NOI18N
448: repositoryPanel.tipLabel.setText(HTTPS_URL_HELP);
449: authFields = true;
450: proxyFields = true;
451: } else if (selectedUrlString.startsWith("svn:")) { // NOI18N
452: repositoryPanel.tipLabel.setText(SVN_URL_HELP);
453: authFields = true;
454: proxyFields = true;
455: } else if (selectedUrlString.startsWith("svn+")) { // NOI18N
456: repositoryPanel.tipLabel
457: .setText(getSVNTunnelTip(selectedUrlString));
458: sshFields = true;
459: } else if (selectedUrlString.startsWith("file:")) { // NOI18N
460: repositoryPanel.tipLabel.setText(LOCAL_URL_HELP);
461: } else {
462: repositoryPanel.tipLabel.setText(NbBundle.getMessage(
463: Repository.class, "MSG_Repository_Url_Help",
464: new Object[] { // NOI18N
465: LOCAL_URL_HELP, HTTP_URL_HELP, HTTPS_URL_HELP,
466: SVN_URL_HELP, SVN_SSH_URL_HELP }));
467: }
468:
469: repositoryPanel.userPasswordField.setVisible(authFields);
470: repositoryPanel.passwordLabel.setVisible(authFields);
471: repositoryPanel.userTextField.setVisible(authFields);
472: repositoryPanel.leaveBlankLabel.setVisible(authFields);
473: repositoryPanel.userLabel.setVisible(authFields);
474: repositoryPanel.savePasswordCheckBox.setVisible(authFields);
475: repositoryPanel.proxySettingsButton.setVisible(proxyFields
476: && ((modeMask & FLAG_SHOW_PROXY) != 0));
477: repositoryPanel.tunnelCommandTextField.setVisible(sshFields);
478: repositoryPanel.tunnelCommandLabel.setVisible(sshFields);
479: repositoryPanel.tunnelLabel.setVisible(sshFields);
480: repositoryPanel.tunnelHelpLabel.setVisible(sshFields);
481:
482: }
483:
484: private String getSVNTunnelTip(String urlString) {
485: String tunnelName = getTunnelName(urlString);
486: return MessageFormat.format(SVN_SSH_URL_HELP, tunnelName)
487: .trim();
488: }
489:
490: private String getTunnelName(String urlString) {
491: int idx = urlString.indexOf(":", 4);
492: if (idx < 0) {
493: idx = urlString.length();
494: }
495: return urlString.substring(4, idx);
496: }
497:
498: /**
499: * Load selected root from Swing structures (from arbitrary thread).
500: * @return null on failure
501: */
502: private String getUrlString() throws InterruptedException {
503: if (!repositoryPanel.urlComboBox.isEditable()) {
504: Object selection = repositoryPanel.urlComboBox
505: .getSelectedItem();
506: if (selection != null) {
507: return selection.toString().trim();
508: }
509: return "";
510: } else {
511: final String[] svnUrl = new String[1];
512: try {
513: Runnable awt = new Runnable() {
514: public void run() {
515: svnUrl[0] = (String) repositoryPanel.urlComboBox
516: .getEditor().getItem().toString()
517: .trim();
518: }
519: };
520: if (SwingUtilities.isEventDispatchThread()) {
521: awt.run();
522: } else {
523: SwingUtilities.invokeAndWait(awt);
524: }
525: return svnUrl[0].trim();
526: } catch (InvocationTargetException e) {
527: Subversion.LOG.log(Level.SEVERE, null, e);
528: }
529: return null;
530: }
531: }
532:
533: public RepositoryConnection getSelectedRC() {
534: String urlString;
535: try {
536: urlString = getUrlString();
537: } catch (InterruptedException ex) {
538: // should not happen
539: Subversion.LOG.log(Level.SEVERE, null, ex);
540: return null;
541: }
542: ;
543:
544: DefaultComboBoxModel dcbm = (DefaultComboBoxModel) repositoryPanel.urlComboBox
545: .getModel();
546: int idx = dcbm.getIndexOf(urlString);
547:
548: if (idx > -1) {
549: return (RepositoryConnection) dcbm.getElementAt(idx);
550: }
551: return getEditedRC();
552: }
553:
554: public boolean savePassword() {
555: return repositoryPanel.savePasswordCheckBox.isSelected();
556: }
557:
558: private void onUsernameChange() {
559: RepositoryConnection rc = getSelectedRC();
560: if (rc != null) {
561: rc.setUsername(repositoryPanel.userTextField.getText());
562: }
563: setValid(true, "");
564: }
565:
566: private void onPasswordChange() {
567: RepositoryConnection rc = getSelectedRC();
568: if (rc != null) {
569: rc.setPassword(new String(repositoryPanel.userPasswordField
570: .getPassword()));
571: }
572: setValid(true, "");
573: }
574:
575: private void onTunnelCommandChange() {
576: RepositoryConnection rc = getSelectedRC();
577: if (rc != null) {
578: rc
579: .setExternalCommand(repositoryPanel.tunnelCommandTextField
580: .getText());
581: }
582: }
583:
584: private void onRemoveClick() {
585: RepositoryConnection rc = getSelectedRC();
586: if (rc != null) {
587: remove(rc);
588: }
589: }
590:
591: private void onSavePasswordChange() {
592: Runnable awt = new Runnable() {
593: public void run() {
594: RepositoryConnection rc = getSelectedRC();
595: if (rc != null) {
596: rc
597: .setSavePassword(repositoryPanel.savePasswordCheckBox
598: .isSelected());
599: }
600: validateSvnUrl();
601: }
602: };
603: SwingUtilities.invokeLater(awt);
604: }
605:
606: public RepositoryPanel getPanel() {
607: return repositoryPanel;
608: }
609:
610: public boolean isValid() {
611: return valid;
612: }
613:
614: private void setValid(boolean valid, String message) {
615: boolean oldValue = this .valid;
616: this .message = message;
617: this .valid = valid;
618: fireValidPropertyChanged(oldValue, valid);
619: }
620:
621: private void fireValidPropertyChanged(boolean oldValue,
622: boolean valid) {
623: if (listeners == null) {
624: return;
625: }
626: for (Iterator it = listeners.iterator(); it.hasNext();) {
627: PropertyChangeListener l = (PropertyChangeListener) it
628: .next();
629: l.propertyChange(new PropertyChangeEvent(this , PROP_VALID,
630: new Boolean(oldValue), new Boolean(valid)));
631: }
632: }
633:
634: public void addPropertyChangeListener(PropertyChangeListener l) {
635: if (listeners == null) {
636: listeners = new ArrayList<PropertyChangeListener>();
637: }
638: listeners.add(l);
639: }
640:
641: public void removePropertyChangeListener(PropertyChangeListener l) {
642: if (listeners == null) {
643: return;
644: }
645: listeners.remove(l);
646: }
647:
648: public String getMessage() {
649: return message;
650: }
651:
652: public void focusGained(FocusEvent focusEvent) {
653: if (focusEvent.getSource() == repositoryPanel.userPasswordField) {
654: repositoryPanel.userPasswordField.selectAll();
655: }
656: }
657:
658: public void focusLost(FocusEvent focusEvent) {
659: // do nothing
660: }
661:
662: public void remove(RepositoryConnection toRemove) {
663: RepositoryModel model = (RepositoryModel) repositoryPanel.urlComboBox
664: .getModel();
665: model.removeElement(toRemove);
666: }
667:
668: public void itemStateChanged(ItemEvent evt) {
669: if (evt.getStateChange() == ItemEvent.SELECTED) {
670: RepositoryConnection rc = (RepositoryConnection) evt
671: .getItem();
672: refresh(rc);
673: updateVisibility();
674: editedRC = new RepositoryConnection(rc);
675: } else if (evt.getStateChange() == ItemEvent.DESELECTED) {
676: updateVisibility();
677: }
678: }
679:
680: private void refresh(RepositoryConnection rc) {
681: repositoryPanel.userTextField.setText(rc.getUsername());
682: repositoryPanel.userPasswordField.setText(rc.getPassword());
683: repositoryPanel.tunnelCommandTextField.setText(rc
684: .getExternalCommand());
685: repositoryPanel.savePasswordCheckBox.setSelected(rc
686: .getSavePassword());
687: }
688:
689: public boolean show(String title, HelpCtx helpCtx,
690: boolean setMaxNeddedSize) {
691: RepositoryDialogPanel rdp = new RepositoryDialogPanel();
692: rdp.panel.setLayout(new BorderLayout());
693: JPanel p = getPanel();
694: if (setMaxNeddedSize) {
695: p.setPreferredSize(maxNeededSize);
696: }
697: rdp.panel.add(p, BorderLayout.NORTH);
698: DialogDescriptor dialogDescriptor = new DialogDescriptor(rdp,
699: title); // NOI18N
700: showDialog(dialogDescriptor, helpCtx);
701: return dialogDescriptor.getValue() == DialogDescriptor.OK_OPTION;
702: }
703:
704: public Object show(String title, HelpCtx helpCtx, Object[] options) {
705: RepositoryDialogPanel rdp = new RepositoryDialogPanel();
706: rdp.panel.setLayout(new BorderLayout());
707: rdp.panel.add(getPanel(), BorderLayout.NORTH);
708: DialogDescriptor dialogDescriptor = new DialogDescriptor(rdp,
709: title); // NOI18N
710: if (options != null) {
711: dialogDescriptor.setOptions(options); // NOI18N
712: }
713: showDialog(dialogDescriptor, helpCtx);
714: return dialogDescriptor.getValue();
715: }
716:
717: private void showDialog(DialogDescriptor dialogDescriptor,
718: HelpCtx helpCtx) {
719: dialogDescriptor.setModal(true);
720: dialogDescriptor.setHelpCtx(helpCtx);
721:
722: Dialog dialog = DialogDisplayer.getDefault().createDialog(
723: dialogDescriptor);
724: dialog.getAccessibleContext().setAccessibleDescription(
725: NbBundle.getMessage(Repository.class,
726: "ACSD_RepositoryPanel"));
727: dialog.getAccessibleContext().setAccessibleName(
728: NbBundle.getMessage(Repository.class,
729: "ACSN_RepositoryPanel"));
730: dialog.setVisible(true);
731: }
732:
733: private boolean isSet(int flag) {
734: return (modeMask & flag) != 0;
735: }
736:
737: public class RepositoryModel extends DefaultComboBoxModel {
738:
739: public RepositoryModel(Vector v) {
740: super (v);
741: }
742:
743: public void setSelectedItem(Object obj) {
744: if (obj instanceof String) {
745: int idx = getIndexOf(obj);
746: if (idx > -1) {
747: obj = getElementAt(idx);
748: } else {
749: obj = createNewRepositoryConnection((String) obj);
750: }
751: }
752: super .setSelectedItem(obj);
753: }
754:
755: public int getIndexOf(Object obj) {
756: if (obj instanceof String) {
757: obj = createNewRepositoryConnection((String) obj);
758: }
759: return super .getIndexOf(obj);
760: }
761:
762: public void addElement(Object obj) {
763: if (obj instanceof String) {
764: obj = createNewRepositoryConnection((String) obj);
765: }
766: super .addElement(obj);
767: }
768:
769: public void insertElementAt(Object obj, int index) {
770: if (obj instanceof String) {
771: String str = (String) obj;
772: RepositoryConnection rc = null;
773: try {
774: rc = (RepositoryConnection) getElementAt(index);
775: } catch (ArrayIndexOutOfBoundsException e) {
776: }
777: if (rc != null) {
778: rc.setUrl(str);
779: obj = rc;
780: }
781: obj = createNewRepositoryConnection(str);
782: }
783: super .insertElementAt(obj, index);
784: }
785:
786: public void removeElement(Object obj) {
787: int index = getIndexOf(obj);
788: if (index != -1) {
789: removeElementAt(index);
790: }
791: }
792:
793: private RepositoryConnection createNewRepositoryConnection(
794: String url) {
795: editedRC.setUrl(url);
796: return new RepositoryConnection(editedRC);
797: }
798: }
799: }
|