001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2008 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 Deve1loper of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 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.ruby.rubyproject.ui.customizer;
043:
044: import java.awt.Component;
045: import java.awt.event.ActionEvent;
046: import java.awt.event.ActionListener;
047: import java.nio.charset.CharsetDecoder;
048: import java.nio.charset.CharsetEncoder;
049: import java.nio.charset.IllegalCharsetNameException;
050: import java.util.logging.Logger;
051: import javax.swing.DefaultComboBoxModel;
052: import javax.swing.JLabel;
053: import javax.swing.JList;
054: import javax.swing.ListCellRenderer;
055: import javax.swing.plaf.UIResource;
056: import java.io.File;
057: import java.nio.charset.Charset;
058: import javax.swing.JPanel;
059: import org.openide.filesystems.FileObject;
060: import org.openide.filesystems.FileUtil;
061: import org.openide.util.HelpCtx;
062:
063: /**
064: *
065: * @author Tomas Zezula
066: */
067: public class CustomizerSources extends JPanel implements
068: HelpCtx.Provider {
069:
070: private String originalEncoding;
071: private final RubyProjectProperties uiProperties;
072:
073: public CustomizerSources(RubyProjectProperties uiProperties) {
074: this .uiProperties = uiProperties;
075: initComponents();
076: sourceSP.getViewport().setBackground(
077: sourceRoots.getBackground());
078: testSP.getViewport().setBackground(testRoots.getBackground());
079:
080: sourceRoots.setModel(uiProperties.SOURCE_ROOTS_MODEL);
081: testRoots.setModel(uiProperties.TEST_ROOTS_MODEL);
082: sourceRoots.getTableHeader().setReorderingAllowed(false);
083: testRoots.getTableHeader().setReorderingAllowed(false);
084:
085: FileObject projectFolder = uiProperties.getProject()
086: .getProjectDirectory();
087: File pf = FileUtil.toFile(projectFolder);
088: this .projectLocation.setText(pf == null ? "" : pf.getPath()); // NOI18N
089:
090: RubySourceRootsUi.EditMediator emSR = RubySourceRootsUi
091: .registerEditMediator(uiProperties.getProject(),
092: uiProperties.getProject().getSourceRoots(),
093: sourceRoots, addSourceRoot, removeSourceRoot,
094: upSourceRoot, downSourceRoot);
095:
096: RubySourceRootsUi.EditMediator emTSR = RubySourceRootsUi
097: .registerEditMediator(uiProperties.getProject(),
098: uiProperties.getProject().getTestSourceRoots(),
099: testRoots, addTestRoot, removeTestRoot,
100: upTestRoot, downTestRoot);
101:
102: emSR.setRelatedEditMediator(emTSR);
103: emTSR.setRelatedEditMediator(emSR);
104:
105: this .originalEncoding = this .uiProperties.getProject()
106: .evaluator().getProperty(
107: RubyProjectProperties.SOURCE_ENCODING);
108: if (this .originalEncoding == null) {
109: this .originalEncoding = Charset.defaultCharset().name();
110: }
111:
112: this .encoding
113: .setModel(new EncodingModel(this .originalEncoding));
114: this .encoding.setRenderer(new EncodingRenderer());
115:
116: this .encoding.addActionListener(new ActionListener() {
117: public void actionPerformed(ActionEvent arg0) {
118: handleEncodingChange();
119: }
120: });
121: }
122:
123: private void handleEncodingChange() {
124: Charset enc = (Charset) encoding.getSelectedItem();
125: String encName;
126: if (enc != null) {
127: encName = enc.name();
128: } else {
129: encName = originalEncoding;
130: }
131: this .uiProperties.putAdditionalProperty(
132: RubyProjectProperties.SOURCE_ENCODING, encName);
133: }
134:
135: public HelpCtx getHelpCtx() {
136: return new HelpCtx(CustomizerSources.class);
137: }
138:
139: private static class EncodingRenderer extends JLabel implements
140: ListCellRenderer, UIResource {
141:
142: public EncodingRenderer() {
143: setOpaque(true);
144: }
145:
146: public Component getListCellRendererComponent(JList list,
147: Object value, int index, boolean isSelected,
148: boolean cellHasFocus) {
149: assert value instanceof Charset;
150: setName("ComboBox.listRenderer"); // NOI18N
151: setText(((Charset) value).displayName());
152: setIcon(null);
153: if (isSelected) {
154: setBackground(list.getSelectionBackground());
155: setForeground(list.getSelectionForeground());
156: } else {
157: setBackground(list.getBackground());
158: setForeground(list.getForeground());
159: }
160: return this ;
161: }
162:
163: @Override
164: public String getName() {
165: String name = super .getName();
166: return name == null ? "ComboBox.renderer" : name; // NOI18N
167: }
168:
169: }
170:
171: private static class EncodingModel extends DefaultComboBoxModel {
172:
173: public EncodingModel(String originalEncoding) {
174: Charset defEnc = null;
175: for (Charset c : Charset.availableCharsets().values()) {
176: if (c.name().equals(originalEncoding)) {
177: defEnc = c;
178: }
179: addElement(c);
180: }
181: if (defEnc == null) {
182: //Create artificial Charset to keep the original value
183: //May happen when the project was set up on the platform
184: //which supports more encodings
185: try {
186: defEnc = new UnknownCharset(originalEncoding);
187: addElement(defEnc);
188: } catch (IllegalCharsetNameException e) {
189: //The source.encoding property is completely broken
190: Logger.getLogger(this .getClass().getName()).info(
191: "IllegalCharsetName: " + originalEncoding);
192: }
193: }
194: if (defEnc == null) {
195: defEnc = Charset.defaultCharset();
196: }
197: setSelectedItem(defEnc);
198: }
199: }
200:
201: private static class UnknownCharset extends Charset {
202:
203: UnknownCharset(String name) {
204: super (name, new String[0]);
205: }
206:
207: public boolean contains(Charset c) {
208: throw new UnsupportedOperationException();
209: }
210:
211: public CharsetDecoder newDecoder() {
212: throw new UnsupportedOperationException();
213: }
214:
215: public CharsetEncoder newEncoder() {
216: throw new UnsupportedOperationException();
217: }
218: }
219:
220: /** This method is called from within the constructor to
221: * initialize the form.
222: * WARNING: Do NOT modify this code. The content of this method is
223: * always regenerated by the Form Editor.
224: */
225: // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
226: private void initComponents() {
227:
228: prjFolderLabel = new javax.swing.JLabel();
229: projectLocation = new javax.swing.JTextField();
230: encodingPanel = new javax.swing.JPanel();
231: encodingLabel = new javax.swing.JLabel();
232: encoding = new javax.swing.JComboBox();
233: sourceFolderLabel = new javax.swing.JLabel();
234: sourceSP = new javax.swing.JScrollPane();
235: sourceRoots = new javax.swing.JTable();
236: addSourceRoot = new javax.swing.JButton();
237: removeSourceRoot = new javax.swing.JButton();
238: upSourceRoot = new javax.swing.JButton();
239: downSourceRoot = new javax.swing.JButton();
240: testFolderLabel = new javax.swing.JLabel();
241: addTestRoot = new javax.swing.JButton();
242: removeTestRoot = new javax.swing.JButton();
243: upTestRoot = new javax.swing.JButton();
244: downTestRoot = new javax.swing.JButton();
245: testSP = new javax.swing.JScrollPane();
246: testRoots = new javax.swing.JTable();
247:
248: prjFolderLabel.setLabelFor(projectLocation);
249: java.util.ResourceBundle bundle = java.util.ResourceBundle
250: .getBundle("org/netbeans/modules/ruby/rubyproject/ui/customizer/Bundle"); // NOI18N
251: org.openide.awt.Mnemonics.setLocalizedText(prjFolderLabel,
252: bundle.getString("CTL_ProjectFolder")); // NOI18N
253:
254: projectLocation.setEditable(false);
255:
256: encodingLabel.setLabelFor(encoding);
257: org.openide.awt.Mnemonics.setLocalizedText(encodingLabel,
258: org.openide.util.NbBundle.getMessage(
259: CustomizerSources.class, "TXT_Encoding")); // NOI18N
260:
261: org.jdesktop.layout.GroupLayout encodingPanelLayout = new org.jdesktop.layout.GroupLayout(
262: encodingPanel);
263: encodingPanel.setLayout(encodingPanelLayout);
264: encodingPanelLayout
265: .setHorizontalGroup(encodingPanelLayout
266: .createParallelGroup(
267: org.jdesktop.layout.GroupLayout.LEADING)
268: .add(
269: encodingPanelLayout
270: .createSequentialGroup()
271: .add(encodingLabel)
272: .addPreferredGap(
273: org.jdesktop.layout.LayoutStyle.RELATED)
274: .add(
275: encoding,
276: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
277: 137,
278: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
279: .addContainerGap(405,
280: Short.MAX_VALUE)));
281: encodingPanelLayout
282: .setVerticalGroup(encodingPanelLayout
283: .createParallelGroup(
284: org.jdesktop.layout.GroupLayout.LEADING)
285: .add(
286: encodingPanelLayout
287: .createParallelGroup(
288: org.jdesktop.layout.GroupLayout.BASELINE)
289: .add(encodingLabel)
290: .add(
291: encoding,
292: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
293: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
294: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)));
295:
296: encodingLabel
297: .getAccessibleContext()
298: .setAccessibleDescription(
299: org.openide.util.NbBundle
300: .getMessage(CustomizerSources.class,
301: "CustomizerSources.encodingLabel.AccessibleContext.accessibleDescription")); // NOI18N
302:
303: sourceFolderLabel.setLabelFor(sourceRoots);
304: org.openide.awt.Mnemonics.setLocalizedText(sourceFolderLabel,
305: bundle.getString("CTL_SourceRoots")); // NOI18N
306:
307: sourceRoots.setModel(new javax.swing.table.DefaultTableModel(
308: new Object[][] { { null, null }, { null, null },
309: { null, null }, { null, null } }, new String[] {
310: "Package Folder", "Label" }) {
311: Class[] types = new Class[] { java.lang.Object.class,
312: java.lang.String.class };
313: boolean[] canEdit = new boolean[] { false, false };
314:
315: public Class getColumnClass(int columnIndex) {
316: return types[columnIndex];
317: }
318:
319: public boolean isCellEditable(int rowIndex, int columnIndex) {
320: return canEdit[columnIndex];
321: }
322: });
323: sourceSP.setViewportView(sourceRoots);
324: sourceRoots.getAccessibleContext().setAccessibleDescription(
325: bundle.getString("AD_CustomizerSources_sourceRoots")); // NOI18N
326:
327: org.openide.awt.Mnemonics.setLocalizedText(addSourceRoot,
328: bundle.getString("CTL_AddSourceRoot")); // NOI18N
329:
330: org.openide.awt.Mnemonics.setLocalizedText(removeSourceRoot,
331: bundle.getString("CTL_RemoveSourceRoot")); // NOI18N
332:
333: org.openide.awt.Mnemonics.setLocalizedText(upSourceRoot, bundle
334: .getString("CTL_UpSourceRoot")); // NOI18N
335:
336: org.openide.awt.Mnemonics.setLocalizedText(downSourceRoot,
337: bundle.getString("CTL_DownSourceRoot")); // NOI18N
338:
339: testFolderLabel.setLabelFor(testRoots);
340: org.openide.awt.Mnemonics.setLocalizedText(testFolderLabel,
341: bundle.getString("CTL_TestRoots")); // NOI18N
342:
343: org.openide.awt.Mnemonics.setLocalizedText(addTestRoot, bundle
344: .getString("CTL_AddTestRoot")); // NOI18N
345:
346: org.openide.awt.Mnemonics.setLocalizedText(removeTestRoot,
347: bundle.getString("CTL_RemoveTestRoot")); // NOI18N
348:
349: org.openide.awt.Mnemonics.setLocalizedText(upTestRoot, bundle
350: .getString("CTL_UpTestRoot")); // NOI18N
351:
352: org.openide.awt.Mnemonics.setLocalizedText(downTestRoot, bundle
353: .getString("CTL_DownTestRoot")); // NOI18N
354:
355: testRoots.setModel(new javax.swing.table.DefaultTableModel(
356: new Object[][] { { null, null }, { null, null },
357: { null, null }, { null, null } }, new String[] {
358: "Package Folder", "Label" }) {
359: Class[] types = new Class[] { java.lang.Object.class,
360: java.lang.String.class };
361: boolean[] canEdit = new boolean[] { false, false };
362:
363: public Class getColumnClass(int columnIndex) {
364: return types[columnIndex];
365: }
366:
367: public boolean isCellEditable(int rowIndex, int columnIndex) {
368: return canEdit[columnIndex];
369: }
370: });
371: testSP.setViewportView(testRoots);
372: testRoots.getAccessibleContext().setAccessibleDescription(
373: bundle.getString("AD_CustomizerSources_testRoots")); // NOI18N
374:
375: org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(
376: this );
377: this .setLayout(layout);
378: layout
379: .setHorizontalGroup(layout
380: .createParallelGroup(
381: org.jdesktop.layout.GroupLayout.LEADING)
382: .add(
383: encodingPanel,
384: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
385: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
386: Short.MAX_VALUE)
387: .add(
388: layout
389: .createSequentialGroup()
390: .add(prjFolderLabel)
391: .addPreferredGap(
392: org.jdesktop.layout.LayoutStyle.RELATED)
393: .add(
394: projectLocation,
395: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
396: 514, Short.MAX_VALUE))
397: .add(
398: layout
399: .createSequentialGroup()
400: .add(
401: sourceFolderLabel,
402: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
403: 131,
404: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
405: .addContainerGap())
406: .add(
407: org.jdesktop.layout.GroupLayout.TRAILING,
408: layout
409: .createSequentialGroup()
410: .add(
411: layout
412: .createParallelGroup(
413: org.jdesktop.layout.GroupLayout.LEADING)
414: .add(
415: testFolderLabel,
416: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
417: 147,
418: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
419: .add(
420: org.jdesktop.layout.GroupLayout.TRAILING,
421: layout
422: .createParallelGroup(
423: org.jdesktop.layout.GroupLayout.TRAILING)
424: .add(
425: org.jdesktop.layout.GroupLayout.LEADING,
426: testSP,
427: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
428: 494,
429: Short.MAX_VALUE)
430: .add(
431: sourceSP,
432: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
433: 494,
434: Short.MAX_VALUE)))
435: .add(9, 9, 9)
436: .add(
437: layout
438: .createParallelGroup(
439: org.jdesktop.layout.GroupLayout.TRAILING,
440: false)
441: .add(
442: addSourceRoot,
443: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
444: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
445: Short.MAX_VALUE)
446: .add(
447: removeSourceRoot,
448: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
449: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
450: Short.MAX_VALUE)
451: .add(
452: upSourceRoot,
453: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
454: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
455: Short.MAX_VALUE)
456: .add(
457: downSourceRoot,
458: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
459: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
460: Short.MAX_VALUE)
461: .add(
462: addTestRoot,
463: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
464: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
465: Short.MAX_VALUE)
466: .add(
467: removeTestRoot,
468: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
469: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
470: Short.MAX_VALUE)
471: .add(
472: upTestRoot,
473: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
474: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
475: Short.MAX_VALUE)
476: .add(
477: downTestRoot,
478: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
479: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
480: Short.MAX_VALUE))));
481: layout
482: .setVerticalGroup(layout
483: .createParallelGroup(
484: org.jdesktop.layout.GroupLayout.LEADING)
485: .add(
486: layout
487: .createSequentialGroup()
488: .add(
489: layout
490: .createParallelGroup(
491: org.jdesktop.layout.GroupLayout.LEADING)
492: .add(
493: prjFolderLabel)
494: .add(
495: projectLocation,
496: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
497: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
498: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
499: .add(2, 2, 2)
500: .add(sourceFolderLabel)
501: .addPreferredGap(
502: org.jdesktop.layout.LayoutStyle.RELATED)
503: .add(
504: layout
505: .createParallelGroup(
506: org.jdesktop.layout.GroupLayout.LEADING)
507: .add(
508: layout
509: .createSequentialGroup()
510: .add(
511: addSourceRoot)
512: .addPreferredGap(
513: org.jdesktop.layout.LayoutStyle.RELATED)
514: .add(
515: removeSourceRoot)
516: .addPreferredGap(
517: org.jdesktop.layout.LayoutStyle.RELATED)
518: .add(
519: upSourceRoot)
520: .addPreferredGap(
521: org.jdesktop.layout.LayoutStyle.RELATED)
522: .add(
523: downSourceRoot))
524: .add(
525: sourceSP,
526: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
527: 169,
528: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
529: .addPreferredGap(
530: org.jdesktop.layout.LayoutStyle.RELATED)
531: .add(testFolderLabel)
532: .addPreferredGap(
533: org.jdesktop.layout.LayoutStyle.RELATED)
534: .add(
535: layout
536: .createParallelGroup(
537: org.jdesktop.layout.GroupLayout.LEADING)
538: .add(
539: layout
540: .createSequentialGroup()
541: .add(
542: addTestRoot)
543: .addPreferredGap(
544: org.jdesktop.layout.LayoutStyle.RELATED)
545: .add(
546: removeTestRoot)
547: .addPreferredGap(
548: org.jdesktop.layout.LayoutStyle.RELATED)
549: .add(
550: upTestRoot)
551: .addPreferredGap(
552: org.jdesktop.layout.LayoutStyle.RELATED)
553: .add(
554: downTestRoot))
555: .add(
556: testSP,
557: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
558: 182,
559: Short.MAX_VALUE))
560: .addPreferredGap(
561: org.jdesktop.layout.LayoutStyle.RELATED)
562: .add(
563: encodingPanel,
564: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
565: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
566: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)));
567:
568: projectLocation
569: .getAccessibleContext()
570: .setAccessibleDescription(
571: bundle
572: .getString("AD_CustomizerSources_projectLocation")); // NOI18N
573: addSourceRoot.getAccessibleContext().setAccessibleDescription(
574: bundle.getString("AD_CustomizerSources_addSourceRoot")); // NOI18N
575: removeSourceRoot
576: .getAccessibleContext()
577: .setAccessibleDescription(
578: bundle
579: .getString("AD_CustomizerSources_removeSourceRoot")); // NOI18N
580: upSourceRoot.getAccessibleContext().setAccessibleDescription(
581: bundle.getString("AD_CustomizerSources_upSourceRoot")); // NOI18N
582: downSourceRoot
583: .getAccessibleContext()
584: .setAccessibleDescription(
585: bundle
586: .getString("AD_CustomizerSources_downSourceRoot")); // NOI18N
587: addTestRoot.getAccessibleContext().setAccessibleDescription(
588: bundle.getString("AD_CustomizerSources_addTestRoot")); // NOI18N
589: removeTestRoot
590: .getAccessibleContext()
591: .setAccessibleDescription(
592: bundle
593: .getString("AD_CustomizerSources_removeTestRoot")); // NOI18N
594: upTestRoot.getAccessibleContext().setAccessibleDescription(
595: bundle.getString("AD_CustomizerSources_upTestRoot")); // NOI18N
596: downTestRoot.getAccessibleContext().setAccessibleDescription(
597: bundle.getString("AD_CustomizerSources_downTestRoot")); // NOI18N
598: }// </editor-fold>//GEN-END:initComponents
599:
600: // Variables declaration - do not modify//GEN-BEGIN:variables
601: private javax.swing.JButton addSourceRoot;
602: private javax.swing.JButton addTestRoot;
603: private javax.swing.JButton downSourceRoot;
604: private javax.swing.JButton downTestRoot;
605: private javax.swing.JComboBox encoding;
606: private javax.swing.JLabel encodingLabel;
607: private javax.swing.JPanel encodingPanel;
608: private javax.swing.JLabel prjFolderLabel;
609: private javax.swing.JTextField projectLocation;
610: private javax.swing.JButton removeSourceRoot;
611: private javax.swing.JButton removeTestRoot;
612: private javax.swing.JLabel sourceFolderLabel;
613: private javax.swing.JTable sourceRoots;
614: private javax.swing.JScrollPane sourceSP;
615: private javax.swing.JLabel testFolderLabel;
616: private javax.swing.JTable testRoots;
617: private javax.swing.JScrollPane testSP;
618: private javax.swing.JButton upSourceRoot;
619: private javax.swing.JButton upTestRoot;
620: // End of variables declaration//GEN-END:variables
621:
622: }
|