blob: c4192025b9ee30283f263e7911bad32c0fba8f8c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.autoupdate.ui;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashSet;
import java.util.Set;
import java.util.prefs.Preferences;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.netbeans.api.autoupdate.UpdateUnitProvider;
import org.netbeans.api.autoupdate.UpdateUnitProviderFactory;
import org.openide.util.ImageUtilities;
import org.openide.util.NbBundle;
/**
* @author Radek Matous
*/
public class UpdateUnitProviderPanel extends javax.swing.JPanel {
private DocumentListener listener;
private FocusListener focusNameListener;
private FocusListener focusUrlListener;
private final JButton bOK = new JButton(NbBundle.getMessage(UpdateUnitProviderPanel.class, "UpdateUnitProviderPanel_OK"));//NOI18N
private Set<String> namesOfProviders = null;
private final boolean isEdit;
private final String originalName;
private final Icon errorIcon = ImageUtilities.loadImageIcon("org/netbeans/modules/autoupdate/ui/resources/error.png", false);
/** Creates new form UpdateUnitProviderPanel */
public UpdateUnitProviderPanel(boolean isActive, String name, String url, boolean editing, boolean isTrusted) {
isEdit = editing;
originalName = name;
initComponents();
addListeners ();
tfURL.setText(url);
tfName.setText(name);
cbActive.setSelected(isActive);
cbTrusted.setSelected(isTrusted);
getAccessibleContext().setAccessibleName("ACN_UpdateCenterCustomizer");
getAccessibleContext().setAccessibleDescription("ACD_UpdateCenterCustomizer");
}
JButton getOKButton() {
return bOK;
}
@Override
public void addNotify() {
super.addNotify();
addListeners ();
}
public void updateErrorMessage(String error) {
if (error == null) {
errorLabel.setText("");
errorLabel.setIcon(null);
bOK.setEnabled(true);
} else {
errorLabel.setText(error);
errorLabel.setIcon(errorIcon);
bOK.setEnabled(false);
}
}
private void addListeners () {
if (listener == null) {
listener = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent arg0) {
update();
}
@Override
public void removeUpdate(DocumentEvent arg0) {
update();
}
@Override
public void changedUpdate(DocumentEvent arg0) {
update();
}
private void update() {
updateErrorMessage(getErrorMessage());
}
private String getErrorMessage() {
final String providerName = getProviderName();
String url = getProviderURL();
if (providerName.length() == 0) {
return NbBundle.getMessage(UpdateUnitProviderPanel.class,
"UpdateUnitProviderPanel.error.name.short");
} else if (url.length() == 0) {
return NbBundle.getMessage(UpdateUnitProviderPanel.class,
"UpdateUnitProviderPanel.error.url.short");
}
if (!(isEdit && providerName.equals(originalName)) &&
getNamesOfProviders().contains(providerName)) {
return NbBundle.getMessage(UpdateUnitProviderPanel.class,
"UpdateUnitProviderPanel.error.name.dup");
}
boolean isOk = true;
try {
new URI(url).toURL();
//#132506
if (url.startsWith("http:") && !url.startsWith("http://")) {
isOk = false;
}
if (isOk) {
//workaround for Issue #160766
//Use "_removed" here instead of UpdateUnitProviderImpl.REMOVED_MASK since is private and not in api/spi
if ((providerName + "_removed").length() > Preferences.MAX_NAME_LENGTH) {
return NbBundle.getMessage(UpdateUnitProviderPanel.class,
"UpdateUnitProviderPanel.error.name.toolong");
}
}
} catch (MalformedURLException x) {
isOk = false;
} catch (URISyntaxException x) {
isOk = false;
} catch (IllegalArgumentException x) {
isOk = false;
}
if(!isOk) {
return NbBundle.getMessage(UpdateUnitProviderPanel.class,
"UpdateUnitProviderPanel.error.url.invalid");
}
return null;
}
};
focusNameListener = new FocusListener () {
int currentSelectionStart = 0;
int currentSelectionEnd = 0;
@Override
public void focusGained(FocusEvent e) {
if (e.getOppositeComponent () != null) {
tfName.selectAll ();
} else {
tfName.select (currentSelectionStart, currentSelectionEnd);
}
}
@Override
public void focusLost(FocusEvent e) {
currentSelectionStart = tfName.getSelectionStart ();
currentSelectionEnd = tfName.getSelectionEnd ();
tfName.select (0, 0);
}
};
tfName.addFocusListener (focusNameListener);
focusUrlListener = new FocusListener () {
int currentSelectionStart = 0;
int currentSelectionEnd = 0;
@Override
public void focusGained(FocusEvent e) {
if (e.getOppositeComponent () != null) {
tfURL.selectAll ();
} else {
tfURL.select (currentSelectionStart, currentSelectionEnd);
}
}
@Override
public void focusLost(FocusEvent e) {
currentSelectionStart = tfURL.getSelectionStart ();
currentSelectionEnd = tfURL.getSelectionEnd ();
tfURL.select (0, 0);
}
};
tfURL.addFocusListener (focusUrlListener);
tfName.getDocument().addDocumentListener(listener);
tfURL.getDocument().addDocumentListener(listener);
}
}
private Set<String> getNamesOfProviders () {
if (namesOfProviders == null) {
namesOfProviders = new HashSet<String> ();
for (UpdateUnitProvider p : UpdateUnitProviderFactory.getDefault ().getUpdateUnitProviders (false)) {
namesOfProviders.add (p.getDisplayName ());
}
}
return namesOfProviders;
}
private void removeListener() {
if (listener != null) {
tfName.getDocument().removeDocumentListener(listener);
tfURL.getDocument().removeDocumentListener(listener);
tfName.removeFocusListener (focusNameListener);
tfURL.removeFocusListener (focusUrlListener);
listener = null;
}
}
@Override
public void removeNotify() {
super.removeNotify();
removeListener();
}
public String getDisplayName() {
return NbBundle.getMessage(UpdateUnitProviderPanel.class, "UpdateUnitProviderPanel_displayName");//NOI18N
}
public boolean isActive() {
return cbActive.isSelected();
}
public String getProviderName() {
return tfName.getText().trim();
}
public String getProviderURL() {
return tfURL.getText().trim();
}
public boolean isTrusted() {
return cbTrusted.isSelected();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
lName = new javax.swing.JLabel();
tfName = new javax.swing.JTextField();
lURL = new javax.swing.JLabel();
tfURL = new javax.swing.JTextField();
cbActive = new javax.swing.JCheckBox();
errorLabel = new javax.swing.JLabel();
cbTrusted = new javax.swing.JCheckBox();
lName.setLabelFor(tfName);
org.openide.awt.Mnemonics.setLocalizedText(lName, org.openide.util.NbBundle.getMessage(UpdateUnitProviderPanel.class, "UpdateUnitProviderPanel.lName.text")); // NOI18N
lURL.setLabelFor(tfURL);
org.openide.awt.Mnemonics.setLocalizedText(lURL, org.openide.util.NbBundle.getMessage(UpdateUnitProviderPanel.class, "UpdateUnitProviderPanel.lURL.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(cbActive, org.openide.util.NbBundle.getMessage(UpdateUnitProviderPanel.class, "UpdateUnitProviderPanel.cbActive.text")); // NOI18N
cbActive.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
org.openide.awt.Mnemonics.setLocalizedText(cbTrusted, org.openide.util.NbBundle.getMessage(UpdateUnitProviderPanel.class, "UpdateUnitProviderPanel.cbTrusted.text")); // NOI18N
cbTrusted.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(errorLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 534, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(lName)
.addComponent(lURL))
.addGap(15, 15, 15)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(tfURL, javax.swing.GroupLayout.DEFAULT_SIZE, 474, Short.MAX_VALUE)
.addComponent(tfName, javax.swing.GroupLayout.DEFAULT_SIZE, 474, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(cbTrusted)
.addComponent(cbActive))
.addGap(0, 0, Short.MAX_VALUE)))))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lName)
.addComponent(tfName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cbActive)
.addGap(24, 24, 24)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lURL)
.addComponent(tfURL, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(cbTrusted)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(errorLabel)
.addContainerGap())
);
lName.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(UpdateUnitProviderPanel.class, "UpdateUnitProviderPanel.lName.adesc")); // NOI18N
lURL.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(UpdateUnitProviderPanel.class, "UpdateUnitProviderPanel.lURL.adesc")); // NOI18N
cbActive.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(UpdateUnitProviderPanel.class, "UpdateUnitProviderPanel.cbActive.adesc")); // NOI18N
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JCheckBox cbActive;
private javax.swing.JCheckBox cbTrusted;
private javax.swing.JLabel errorLabel;
private javax.swing.JLabel lName;
private javax.swing.JLabel lURL;
private javax.swing.JTextField tfName;
private javax.swing.JTextField tfURL;
// End of variables declaration//GEN-END:variables
}