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 General
007: * Public License Version 2 only ("GPL") or the Common Development and Distribution
008: * License("CDDL") (collectively, the "License"). You may not use this file except in
009: * compliance with the License. You can obtain a copy of the License at
010: * http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
011: * License for the specific language governing permissions and limitations under the
012: * License. When distributing the software, include this License Header Notice in
013: * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP. Sun
014: * designates this particular file as subject to the "Classpath" exception as
015: * provided by Sun in the GPL Version 2 section of the License file that
016: * accompanied this code. If applicable, add the following below the License Header,
017: * with the fields enclosed by brackets [] replaced by your own identifying
018: * information: "Portions Copyrighted [year] [name of copyright owner]"
019: *
020: * Contributor(s):
021: *
022: * The Original Software is NetBeans. The Initial Developer of the Original Software
023: * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
024: * Rights Reserved.
025: *
026: * If you wish your version of this file to be governed by only the CDDL or only the
027: * GPL Version 2, indicate your decision by adding "[Contributor] elects to include
028: * this software in this distribution under the [CDDL or GPL Version 2] license." If
029: * you do not indicate a single choice of license, a recipient has the option to
030: * distribute your version of this file under either the CDDL, the GPL Version 2 or
031: * to extend the choice of license to its licensees as provided above. However, if
032: * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then
033: * the option applies only if the new code is made subject to such option by the
034: * copyright holder.
035: */
036:
037: package org.netbeans.installer.wizard.components.panels;
038:
039: import java.awt.GridBagConstraints;
040: import java.awt.Insets;
041: import java.awt.event.ActionEvent;
042: import java.awt.event.ActionListener;
043: import java.io.File;
044: import java.io.IOException;
045: import javax.swing.JComponent;
046: import javax.swing.JFileChooser;
047: import javax.swing.event.DocumentEvent;
048: import javax.swing.event.DocumentListener;
049: import org.netbeans.installer.product.components.Product;
050: import org.netbeans.installer.utils.ErrorManager;
051: import org.netbeans.installer.utils.FileUtils;
052: import org.netbeans.installer.utils.exceptions.InitializationException;
053: import org.netbeans.installer.utils.helper.swing.NbiButton;
054: import org.netbeans.installer.utils.helper.swing.NbiLabel;
055: import org.netbeans.installer.utils.ResourceUtils;
056: import org.netbeans.installer.utils.StringUtils;
057: import org.netbeans.installer.utils.SystemUtils;
058: import org.netbeans.installer.utils.exceptions.NativeException;
059: import org.netbeans.installer.utils.helper.swing.NbiDirectoryChooser;
060: import org.netbeans.installer.utils.helper.swing.NbiPanel;
061: import org.netbeans.installer.utils.helper.swing.NbiTextField;
062: import org.netbeans.installer.wizard.ui.SwingUi;
063: import org.netbeans.installer.wizard.ui.WizardUi;
064: import org.netbeans.installer.wizard.containers.SwingContainer;
065:
066: /**
067: *
068: * @author Kirill Sorokin
069: */
070: public class DestinationPanel extends ErrorMessagePanel {
071: /////////////////////////////////////////////////////////////////////////////////
072: // Instance
073: public DestinationPanel() {
074: setProperty(TITLE_PROPERTY, DEFAULT_TITLE);
075: setProperty(DESCRIPTION_PROPERTY, DEFAULT_DESCRIPTION);
076:
077: setProperty(DESTINATION_LABEL_TEXT_PROPERTY,
078: DEFAULT_DESTINATION_LABEL_TEXT);
079: setProperty(DESTINATION_BUTTON_TEXT_PROPERTY,
080: DEFAULT_DESTINATION_BUTTON_TEXT);
081: setProperty(ERROR_NULL_PROPERTY, DEFAULT_ERROR_NULL);
082: setProperty(ERROR_NOT_VALID_PROPERTY, DEFAULT_ERROR_NOT_VALID);
083: setProperty(ERROR_CONTAINS_EXCLAMATION_PROPERTY,
084: DEFAULT_ERROR_CONTAINS_EXCLAMATION);
085: setProperty(ERROR_CONTAINS_SEMICOLON_PROPERTY,
086: DEFAULT_ERROR_CONTAINS_SEMICOLON);
087: setProperty(ERROR_CONTAINS_COLON_PROPERTY,
088: DEFAULT_ERROR_CONTAINS_COLON);
089: setProperty(ERROR_CONTAINS_AMPERSAND_PROPERTY,
090: DEFAULT_ERROR_CONTAINS_AMPERSAND);
091: setProperty(ERROR_CONTAINS_WRONG_CHAR_PROPERTY,
092: DEFAULT_ERROR_CONTAINS_WRONG_CHAR);
093: setProperty(ERROR_MATCHES_PROHIBITED_REGEXP,
094: DEFAULT_ERROR_MATCHES_PROHIBITIED_REGEXP);
095: setProperty(ERROR_CANNOT_CANONIZE_PROPERTY,
096: DEFAULT_ERROR_CANNOT_CANONIZE);
097: setProperty(ERROR_NOT_ABSOLUTE_PROPERTY,
098: DEFAULT_ERROR_NOT_ABSOLUTE);
099: setProperty(ERROR_NOT_DIRECTORY_PROPERTY,
100: DEFAULT_ERROR_NOT_DIRECTORY);
101: setProperty(ERROR_NOT_READABLE_PROPERTY,
102: DEFAULT_ERROR_NOT_READABLE);
103: setProperty(ERROR_NOT_WRITABLE_PROPERTY,
104: DEFAULT_ERROR_NOT_WRITABLE);
105: setProperty(ERROR_NOT_EMPTY_PROPERTY, DEFAULT_ERROR_NOT_EMPTY);
106: setProperty(ERROR_NOT_ENDS_WITH_APP_PROPERTY,
107: DEFAULT_ERROR_NOT_ENDS_WITH_APP);
108: setProperty(ERROR_NOT_ENOUGH_SPACE_PROPERTY,
109: DEFAULT_ERROR_NOT_ENOUGH_SPACE);
110: setProperty(ERROR_CANNOT_GET_LOGIC_PROPERTY,
111: DEFAULT_ERROR_CANNOT_GET_LOGIC);
112: setProperty(ERROR_CANNOT_CHECK_SPACE_PROPERTY,
113: DEFAULT_ERROR_CANNOT_CHECK_SPACE);
114: }
115:
116: @Override
117: public WizardUi getWizardUi() {
118: if (wizardUi == null) {
119: wizardUi = new DestinationPanelUi(this );
120: }
121:
122: return wizardUi;
123: }
124:
125: /////////////////////////////////////////////////////////////////////////////////
126: // Inner Classes
127: public static class DestinationPanelUi extends ErrorMessagePanelUi {
128: protected DestinationPanel component;
129:
130: public DestinationPanelUi(DestinationPanel component) {
131: super (component);
132:
133: this .component = component;
134: }
135:
136: @Override
137: public SwingUi getSwingUi(SwingContainer container) {
138: if (swingUi == null) {
139: swingUi = new DestinationPanelSwingUi(component,
140: container);
141: }
142:
143: return super .getSwingUi(container);
144: }
145: }
146:
147: public static class DestinationPanelSwingUi extends
148: ErrorMessagePanelSwingUi {
149: protected DestinationPanel component;
150:
151: private NbiLabel destinationLabel;
152: private NbiTextField destinationField;
153: private NbiButton destinationButton;
154:
155: private NbiPanel spacerPanel;
156:
157: private NbiDirectoryChooser fileChooser;
158:
159: public DestinationPanelSwingUi(
160: final DestinationPanel component,
161: final SwingContainer container) {
162: super (component, container);
163:
164: this .component = component;
165:
166: initComponents();
167: }
168:
169: @Override
170: public JComponent getDefaultFocusOwner() {
171: return destinationField;
172: }
173:
174: // protected ////////////////////////////////////////////////////////////////
175: @Override
176: protected void initialize() {
177: destinationLabel.setText(component
178: .getProperty(DESTINATION_LABEL_TEXT_PROPERTY));
179: destinationButton.setText(component
180: .getProperty(DESTINATION_BUTTON_TEXT_PROPERTY));
181:
182: final Product product = (Product) component.getWizard()
183: .getContext().get(Product.class);
184:
185: String destination = null;
186:
187: destination = product
188: .getProperty(Product.INSTALLATION_LOCATION_PROPERTY);
189:
190: if (destination == null) {
191: destination = DEFAULT_DESTINATION;
192: }
193:
194: destination = component.resolvePath(destination)
195: .getAbsolutePath();
196:
197: try {
198: if (SystemUtils.isMacOS()
199: && (product.getLogic().wrapForMacOs() || product
200: .getLogic().requireDotAppForMacOs())) {
201: if (!destination.endsWith(APP_SUFFIX)) {
202: final File parent = new File(destination)
203: .getParentFile();
204: final String suffix = product.getDisplayName()
205: + APP_SUFFIX;
206:
207: if (parent != null) {
208: destination = new File(parent, suffix)
209: .getAbsolutePath();
210: } else {
211: destination = new File(destination, suffix)
212: .getAbsolutePath();
213: }
214: }
215: }
216: } catch (InitializationException e) {
217: ErrorManager.notifyError(component
218: .getProperty(ERROR_CANNOT_GET_LOGIC_PROPERTY),
219: e);
220: }
221:
222: destinationField.setText(destination);
223:
224: super .initialize();
225: }
226:
227: @Override
228: protected void saveInput() {
229: try {
230: String value = destinationField.getText().trim();
231: value = FileUtils.eliminateRelativity(value)
232: .getCanonicalPath();
233:
234: component.getWizard().setProperty(
235: Product.INSTALLATION_LOCATION_PROPERTY, value);
236: } catch (IOException e) {
237: ErrorManager
238: .notifyError(
239: component
240: .getProperty(ERROR_CANNOT_CANONIZE_PROPERTY),
241: e);
242: }
243: }
244:
245: protected NbiTextField getDestinationField() {
246: return destinationField;
247: }
248:
249: @Override
250: protected String validateInput() {
251: final String string = destinationField.getText().trim();
252: final Product product = (Product) component.getWizard()
253: .getContext().get(Product.class);
254:
255: try {
256: if (string.equals(StringUtils.EMPTY_STRING)) {
257: return StringUtils.format(component
258: .getProperty(ERROR_NULL_PROPERTY), string);
259: }
260:
261: File file = FileUtils.eliminateRelativity(string);
262:
263: String filePath = file.getAbsolutePath();
264: if (filePath.length() > 45) {
265: filePath = filePath.substring(0, 45) + "...";
266: }
267:
268: if (!SystemUtils.isPathValid(file.getAbsolutePath())) {
269: return StringUtils.format(component
270: .getProperty(ERROR_NOT_VALID_PROPERTY),
271: filePath);
272: }
273:
274: final String[] prohibitedParts = product.getLogic()
275: .getProhibitedInstallationPathParts();
276: if (prohibitedParts != null) {
277: for (String s : prohibitedParts) {
278: if (s != null && s.length() > 0) {
279: String prop = null;
280: if (s.length() == 1) { // character
281: if (file.getAbsolutePath().contains(s)) {
282: if (s.equals("!")) {
283: prop = ERROR_CONTAINS_EXCLAMATION_PROPERTY;
284: } else if (s.equals(";")) {
285: prop = ERROR_CONTAINS_SEMICOLON_PROPERTY;
286: } else if (s.equals(":")) {
287: prop = ERROR_CONTAINS_COLON_PROPERTY;
288: } else if (s.equals("&")) {
289: prop = ERROR_CONTAINS_AMPERSAND_PROPERTY;
290: } else {
291: // no user-friendly description for all other chars at this moment
292: // can be easily extended later
293: prop = ERROR_CONTAINS_WRONG_CHAR_PROPERTY;
294: }
295: }
296: } else {// check if path matches regexp..
297: if (file.getAbsolutePath().matches(s)) {
298: prop = ERROR_MATCHES_PROHIBITED_REGEXP;
299: }
300: }
301: if (prop != null) {
302: return StringUtils
303: .format(component
304: .getProperty(prop),
305: filePath, s);
306: }
307: }
308: }
309: }
310:
311: if (!file.equals(file.getAbsoluteFile())) {
312: return StringUtils.format(component
313: .getProperty(ERROR_NOT_ABSOLUTE_PROPERTY),
314: file.getPath());
315: }
316:
317: try {
318: file = file.getCanonicalFile();
319: } catch (IOException e) {
320: return StringUtils
321: .format(
322: component
323: .getProperty(ERROR_CANNOT_CANONIZE_PROPERTY),
324: filePath);
325: }
326:
327: filePath = file.getAbsolutePath();
328: if (filePath.length() > 45) {
329: filePath = filePath.substring(0, 45) + "...";
330: }
331:
332: if (file.exists() && !file.isDirectory()) {
333: return StringUtils.format(component
334: .getProperty(ERROR_NOT_DIRECTORY_PROPERTY),
335: filePath);
336: }
337:
338: if (!FileUtils.canRead(file)) {
339: return StringUtils.format(component
340: .getProperty(ERROR_NOT_READABLE_PROPERTY),
341: filePath);
342: }
343:
344: if (!FileUtils.canWrite(file)) {
345: return StringUtils.format(component
346: .getProperty(ERROR_NOT_WRITABLE_PROPERTY),
347: filePath);
348: }
349:
350: if (!FileUtils.isEmpty(file)) {
351: return StringUtils.format(component
352: .getProperty(ERROR_NOT_EMPTY_PROPERTY),
353: filePath);
354: }
355:
356: if (SystemUtils.isMacOS()
357: && (product.getLogic().wrapForMacOs() || product
358: .getLogic().requireDotAppForMacOs())
359: && !file.getAbsolutePath().endsWith(APP_SUFFIX)) {
360: return StringUtils
361: .format(
362: component
363: .getProperty(ERROR_NOT_ENDS_WITH_APP_PROPERTY),
364: filePath);
365: }
366:
367: if (!Boolean
368: .getBoolean(SystemUtils.NO_SPACE_CHECK_PROPERTY)) {
369: final long requiredSize = product
370: .getRequiredDiskSpace()
371: + REQUIRED_SPACE_ADDITION;
372: final long availableSize = SystemUtils
373: .getFreeSpace(file);
374: if (availableSize < requiredSize) {
375: return StringUtils
376: .format(
377: component
378: .getProperty(ERROR_NOT_ENOUGH_SPACE_PROPERTY),
379: filePath,
380: StringUtils
381: .formatSize(requiredSize
382: - availableSize));
383: }
384: }
385: } catch (InitializationException e) {
386: ErrorManager.notifyError(component
387: .getProperty(ERROR_CANNOT_GET_LOGIC_PROPERTY),
388: e);
389: } catch (NativeException e) {
390: ErrorManager
391: .notifyError(
392: component
393: .getProperty(ERROR_CANNOT_CHECK_SPACE_PROPERTY),
394: e);
395: }
396:
397: return null;
398: }
399:
400: // private //////////////////////////////////////////////////////////////////
401: private void initComponents() {
402: // destinationField /////////////////////////////////////////////////////
403: destinationField = new NbiTextField();
404: destinationField.getDocument().addDocumentListener(
405: new DocumentListener() {
406: public void changedUpdate(DocumentEvent e) {
407: updateErrorMessage();
408: }
409:
410: public void insertUpdate(DocumentEvent e) {
411: updateErrorMessage();
412: }
413:
414: public void removeUpdate(DocumentEvent e) {
415: updateErrorMessage();
416: }
417: });
418:
419: // destinationLabel /////////////////////////////////////////////////////
420: destinationLabel = new NbiLabel();
421: destinationLabel.setLabelFor(destinationField);
422:
423: // destinationButton ////////////////////////////////////////////////////
424: destinationButton = new NbiButton();
425: destinationButton.addActionListener(new ActionListener() {
426: public void actionPerformed(ActionEvent event) {
427: browseButtonPressed();
428: }
429: });
430:
431: // fileChooser //////////////////////////////////////////////////////////
432: fileChooser = new NbiDirectoryChooser();
433:
434: // spacerPanel //////////////////////////////////////////////////////////
435: spacerPanel = new NbiPanel();
436:
437: // this /////////////////////////////////////////////////////////////////
438: add(destinationLabel, new GridBagConstraints(0, 0, // x, y
439: 2, 1, // width, height
440: 1.0, 0.0, // weight-x, weight-y
441: GridBagConstraints.LINE_START, // anchor
442: GridBagConstraints.HORIZONTAL, // fill
443: new Insets(11, 11, 0, 11), // padding
444: 0, 0)); // padx, pady - ???
445: add(destinationField, new GridBagConstraints(0, 1, // x, y
446: 1, 1, // width, height
447: 1.0, 0.0, // weight-x, weight-y
448: GridBagConstraints.LINE_START, // anchor
449: GridBagConstraints.HORIZONTAL, // fill
450: new Insets(4, 11, 0, 0), // padding
451: 0, 0)); // padx, pady - ???
452: add(destinationButton, new GridBagConstraints(1, 1, // x, y
453: 1, 1, // width, height
454: 0.0, 0.0, // weight-x, weight-y
455: GridBagConstraints.LINE_START, // anchor
456: GridBagConstraints.NONE, // fill
457: new Insets(4, 4, 0, 11), // padding
458: 0, 0)); // padx, pady - ???
459: add(spacerPanel, new GridBagConstraints(1, 50, // x, y
460: 2, 1, // width, height
461: 0.0, 1.0, // weight-x, weight-y
462: GridBagConstraints.CENTER, // anchor
463: GridBagConstraints.BOTH, // fill
464: new Insets(0, 0, 0, 0), // padding
465: 0, 0)); // padx, pady - ???
466: }
467:
468: private void browseButtonPressed() {
469: final Product product = (Product) component.getWizard()
470: .getContext().get(Product.class);
471:
472: final File currentDestination = new File(destinationField
473: .getText());
474:
475: fileChooser.setSelectedFile(currentDestination);
476:
477: if (fileChooser.showOpenDialog(this ) == JFileChooser.APPROVE_OPTION) {
478: String newDestination = fileChooser.getSelectedFile()
479: .getAbsolutePath();
480:
481: try {
482: String suffix = currentDestination.getName();
483:
484: if (SystemUtils.isMacOS()
485: && (product.getLogic().wrapForMacOs() || product
486: .getLogic().requireDotAppForMacOs())) {
487: if (!newDestination.endsWith(APP_SUFFIX)
488: && !suffix.endsWith(APP_SUFFIX)) {
489: suffix += APP_SUFFIX;
490: }
491: }
492: if (!new File(newDestination)
493: .equals(currentDestination)) {
494: newDestination = new File(newDestination,
495: suffix).getAbsolutePath();
496: }
497:
498: } catch (InitializationException e) {
499: ErrorManager
500: .notifyError(
501: component
502: .getProperty(ERROR_CANNOT_GET_LOGIC_PROPERTY),
503: e);
504: }
505:
506: destinationField.setText(newDestination);
507: }
508: }
509: }
510:
511: /////////////////////////////////////////////////////////////////////////////////
512: // Constants
513: public static final String DEFAULT_TITLE = ResourceUtils.getString(
514: DestinationPanel.class, "DP.title"); // NOI18N
515: public static final String DEFAULT_DESCRIPTION = ResourceUtils
516: .getString(DestinationPanel.class, "DP.description"); // NOI18N
517:
518: public static final String DESTINATION_LABEL_TEXT_PROPERTY = "destination.label.text"; // NOI18N
519: public static final String DESTINATION_BUTTON_TEXT_PROPERTY = "destination.button.text"; // NOI18N
520:
521: public static final String DEFAULT_DESTINATION_LABEL_TEXT = ResourceUtils
522: .getString(DestinationPanel.class,
523: "DP.destination.label.text"); // NOI18N
524: public static final String DEFAULT_DESTINATION_BUTTON_TEXT = ResourceUtils
525: .getString(DestinationPanel.class,
526: "DP.destination.button.text"); // NOI18N
527:
528: public static final String ERROR_NULL_PROPERTY = "error.null"; // NOI18N
529: public static final String ERROR_NOT_VALID_PROPERTY = "error.not.valid"; // NOI18N
530: public static final String ERROR_CONTAINS_EXCLAMATION_PROPERTY = "error.contains.exclamation"; // NOI18N
531: public static final String ERROR_CONTAINS_SEMICOLON_PROPERTY = "error.contains.semicolon"; // NOI18N
532: public static final String ERROR_CONTAINS_COLON_PROPERTY = "error.contains.colon"; // NOI18N
533: public static final String ERROR_CONTAINS_AMPERSAND_PROPERTY = "error.contains.ampersand"; // NOI18N
534: public static final String ERROR_CONTAINS_WRONG_CHAR_PROPERTY = "error.contains.wrong.char"; // NOI18N
535: public static final String ERROR_MATCHES_PROHIBITED_REGEXP = "error.matches.prohibited.regexp";//NOI18N
536: public static final String ERROR_NOT_ABSOLUTE_PROPERTY = "error.not.absolute"; // NOI18N
537: public static final String ERROR_CANNOT_CANONIZE_PROPERTY = "error.cannot.canonize"; // NOI18N
538: public static final String ERROR_NOT_DIRECTORY_PROPERTY = "error.not.directory"; // NOI18N
539: public static final String ERROR_NOT_READABLE_PROPERTY = "error.not.readable"; // NOI18N
540: public static final String ERROR_NOT_WRITABLE_PROPERTY = "error.not.writable"; // NOI18N
541: public static final String ERROR_NOT_EMPTY_PROPERTY = "error.not.empty"; // NOI18N
542: public static final String ERROR_NOT_ENDS_WITH_APP_PROPERTY = "error.not.ends.with.app"; // NOI18N
543: public static final String ERROR_NOT_ENOUGH_SPACE_PROPERTY = "error.not.enough.space"; // NOI18N
544: public static final String ERROR_CANNOT_GET_LOGIC_PROPERTY = "error.cannot.get.logic";//NOI18N
545: public static final String ERROR_CANNOT_CHECK_SPACE_PROPERTY = "error.cannot.check.space"; // NOI18N
546:
547: public static final String DEFAULT_ERROR_NULL = ResourceUtils
548: .getString(DestinationPanel.class, "DP.error.null"); // NOI18N
549: public static final String DEFAULT_ERROR_NOT_VALID = ResourceUtils
550: .getString(DestinationPanel.class, "DP.error.not.valid"); // NOI18N
551: public static final String DEFAULT_ERROR_CONTAINS_EXCLAMATION = ResourceUtils
552: .getString(DestinationPanel.class,
553: "DP.error.contains.exclamation"); // NOI18N
554: public static final String DEFAULT_ERROR_CONTAINS_SEMICOLON = ResourceUtils
555: .getString(DestinationPanel.class,
556: "DP.error.contains.semicolon"); // NOI18N
557: public static final String DEFAULT_ERROR_CONTAINS_COLON = ResourceUtils
558: .getString(DestinationPanel.class,
559: "DP.error.contains.colon"); // NOI18N
560: public static final String DEFAULT_ERROR_CONTAINS_AMPERSAND = ResourceUtils
561: .getString(DestinationPanel.class,
562: "DP.error.contains.ampersand"); // NOI18N
563: public static final String DEFAULT_ERROR_CONTAINS_WRONG_CHAR = ResourceUtils
564: .getString(DestinationPanel.class,
565: "DP.error.contains.wrong.char"); // NOI18N
566: public static final String DEFAULT_ERROR_MATCHES_PROHIBITIED_REGEXP = ResourceUtils
567: .getString(DestinationPanel.class,
568: "DP.error.matches.prohibited.regexp"); // NOI18N
569: public static final String DEFAULT_ERROR_NOT_ABSOLUTE = ResourceUtils
570: .getString(DestinationPanel.class, "DP.error.not.absolute"); // NOI18N
571: public static final String DEFAULT_ERROR_CANNOT_CANONIZE = ResourceUtils
572: .getString(DestinationPanel.class,
573: "DP.error.cannot.canonize"); // NOI18N
574: public static final String DEFAULT_ERROR_NOT_DIRECTORY = ResourceUtils
575: .getString(DestinationPanel.class, "DP.error.not.directory"); // NOI18N
576: public static final String DEFAULT_ERROR_NOT_READABLE = ResourceUtils
577: .getString(DestinationPanel.class, "DP.error.not.readable"); // NOI18N
578: public static final String DEFAULT_ERROR_NOT_WRITABLE = ResourceUtils
579: .getString(DestinationPanel.class, "DP.error.not.writable"); // NOI18N
580: public static final String DEFAULT_ERROR_NOT_EMPTY = ResourceUtils
581: .getString(DestinationPanel.class, "DP.error.not.empty"); // NOI18N
582: public static final String DEFAULT_ERROR_NOT_ENDS_WITH_APP = ResourceUtils
583: .getString(DestinationPanel.class,
584: "DP.error.not.ends.with.app"); // NOI18N
585: public static final String DEFAULT_ERROR_NOT_ENOUGH_SPACE = ResourceUtils
586: .getString(DestinationPanel.class,
587: "DP.error.not.enough.space"); // NOI18N
588: public static final String DEFAULT_ERROR_CANNOT_GET_LOGIC = ResourceUtils
589: .getString(DestinationPanel.class,
590: "DP.error.cannot.get.logic"); // NOI18N
591: public static final String DEFAULT_ERROR_CANNOT_CHECK_SPACE = ResourceUtils
592: .getString(ComponentsSelectionPanel.class,
593: "DP.error.cannot.check.space"); // NOI18N
594:
595: public static final String DEFAULT_DESTINATION = ResourceUtils
596: .getString(DestinationPanel.class, "DP.default.destination"); // NOI18N
597:
598: public static final String APP_SUFFIX = ".app"; // NOI18N
599:
600: public static final long REQUIRED_SPACE_ADDITION = 10L * 1024L * 1024L; // 10MB
601: }
|