/*******************************************************************************
* Copyright (c) 2011, 2016 Eurotech and/or its affiliates
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eurotech
*******************************************************************************/
package org.eclipse.kura.web.client.network;
import java.util.List;
import org.eclipse.kura.web.client.messages.Messages;
import org.eclipse.kura.web.client.util.Constants;
import org.eclipse.kura.web.client.util.FormUtils;
import org.eclipse.kura.web.client.util.MessageUtils;
import org.eclipse.kura.web.shared.model.GwtNetIfType;
import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
import org.eclipse.kura.web.shared.model.GwtNetRouterMode;
import org.eclipse.kura.web.shared.model.GwtSession;
import org.eclipse.kura.web.shared.model.GwtWifiWirelessMode;
import com.allen_sauer.gwt.log.client.Log;
import com.extjs.gxt.ui.client.Style.Scroll;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ComponentPlugin;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.Field;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.Radio;
import com.extjs.gxt.ui.client.widget.form.RadioGroup;
import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
import com.extjs.gxt.ui.client.widget.form.SimpleComboValue;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.form.Validator;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Element;
public class DhcpNatConfigTab extends LayoutContainer
{
private static final Messages MSGS = GWT.create(Messages.class);
private final ToolTipBox toolTipField = new ToolTipBox("205px");
private final String defaultToolTip = "Mouse over enabled items on the left to see help text.";
private static final String IPV4_REGEX = "\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b";
@SuppressWarnings("unused")
private GwtSession m_currentSession;
private boolean m_dirty;
private boolean m_initialized;
private GwtNetInterfaceConfig m_selectNetIfConfig;
private TcpIpConfigTab m_tcpIpConfigTab;
private WirelessConfigTab m_wirelessConfigTab;
private FormPanel m_formPanel;
private SimpleComboBox<String> m_modeCombo;
private TextField<String> m_dhcpBeginAddressField;
private TextField<String> m_dhcpEndAddressField;
private TextField<String> m_dhcpSubnetMaskField;
private NumberField m_dhcpLeaseDefaultField;
private NumberField m_dhcpLeaseMaxField;
private Radio m_passDnsRadioTrue;
private Radio m_passDnsRadioFalse;
private RadioGroup m_passDnsRadioGroup;
private ComponentPlugin m_dirtyPlugin;
private class MouseOverListener implements Listener<BaseEvent> {
private String html;
public MouseOverListener(String html) {
this.html = html;
}
public void handleEvent(BaseEvent be) {
toolTipField.setText(html);
}
}
public DhcpNatConfigTab(GwtSession currentSession,
TcpIpConfigTab tcpIpConfigTab,
WirelessConfigTab wirelessConfigTab)
{
m_currentSession = currentSession;
m_tcpIpConfigTab = tcpIpConfigTab;
m_wirelessConfigTab = wirelessConfigTab;
m_dirty = true;
m_initialized = false;
final DhcpNatConfigTab theTab = this;
m_dirtyPlugin = new ComponentPlugin() {
public void init(Component component) {
component.addListener(Events.Change, new Listener<ComponentEvent>() {
public void handleEvent(ComponentEvent be) {
FormUtils.addDirtyFieldIcon(be.getComponent());
theTab.fireEvent(Events.Change);
}
});
}
};
m_tcpIpConfigTab.addListener(Events.Change, new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
refreshForm();
}
});
m_wirelessConfigTab.addListener(Events.Change, new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
refreshForm();
}
});
}
public void setNetInterface(GwtNetInterfaceConfig netIfConfig)
{
m_dirty = true;
m_selectNetIfConfig = netIfConfig;
Log.debug("got new netIfConfig for DHCP server for " + netIfConfig.getName() + ": " +
"\n\t\trouter mode: " + netIfConfig.getRouterMode() +
"\n\t\trouter DHCP start address: " + netIfConfig.getRouterDhcpBeginAddress() +
"\n\t\trouter DHCP end address: " + netIfConfig.getRouterDhcpEndAddress() +
"\n\t\trouter default lease: " + Integer.toString(netIfConfig.getRouterDhcpDefaultLease()) +
"\n\t\trouter max lease: " + Integer.toString(netIfConfig.getRouterDhcpMaxLease()) +
"\n\t\trouter Pass DNS: " + Boolean.toString(netIfConfig.getRouterDnsPass()));
}
public void disableDhcpNat() {
m_selectNetIfConfig.setRouterMode(GwtNetRouterMode.netRouterOff.name());
}
public void getUpdatedNetInterface(GwtNetInterfaceConfig updatedNetIf)
{
if (m_formPanel != null) {
String modeValue = m_modeCombo.getValue().getValue();
for (GwtNetRouterMode mode : GwtNetRouterMode.values()) {
Log.info("Possible Mode: " + mode.name() + " with util: " + MessageUtils.get(mode.name()));
if (MessageUtils.get(mode.name()).equals(modeValue)) {
updatedNetIf.setRouterMode(mode.name());
}
}
Log.info("Mode Value: " + modeValue);
updatedNetIf.setRouterDhcpBeginAddress(m_dhcpBeginAddressField.getValue());
updatedNetIf.setRouterDhcpEndAddress(m_dhcpEndAddressField.getValue());
updatedNetIf.setRouterDhcpSubnetMask(m_dhcpSubnetMaskField.getValue());
if (m_dhcpLeaseDefaultField.getValue() != null) {
updatedNetIf.setRouterDhcpDefaultLease(m_dhcpLeaseDefaultField.getValue().intValue());
}
if (m_dhcpLeaseMaxField.getValue() != null) {
updatedNetIf.setRouterDhcpMaxLease(m_dhcpLeaseMaxField.getValue().intValue());
}
updatedNetIf.setRouterDnsPass(m_passDnsRadioTrue.getValue());
}
}
public boolean isValid() {
if (m_formPanel != null) {
for (Field<?> field : m_formPanel.getFields()) {
if (!field.isValid()) {
return false;
}
}
}
return true;
}
public boolean isDirty() {
if (m_formPanel == null) {
return false;
}
List<Field<?>> fields = m_formPanel.getFields();
for (int i=0; i<fields.size(); i++) {
if (fields.get(i) instanceof Field) {
Field<?> field = (Field<?>) fields.get(i);
if (field.isDirty()) {
if((field.getOriginalValue() != null && field.getOriginalValue().equals("") && field.getValue() == null) ||
(field.getValue() != null && field.getValue().equals("") && field.getOriginalValue() == null)) {
continue;
} else if(field.getOriginalValue() != null && field.getValue() != null && field.getOriginalValue().equals(field.getValue())) {
continue;
} else {
if(field.getOriginalValue() instanceof SimpleComboValue) {
Log.debug("field " + field.getName() + " is dirty - original value: " + ((SimpleComboValue)field.getOriginalValue()).getValue() + " with type: " + field.getOriginalValue().getClass().toString());
if(field.getValue() != null) {
Log.debug("\tnew value: " + ((SimpleComboValue)field.getValue()).getValue() + " with type: " + field.getValue().getClass().toString());
}
} else {
Log.debug("field " + field.getName() + " is dirty - original value: " + field.getOriginalValue() + " with type: " + field.getOriginalValue().getClass().toString());
if(field.getValue() != null) {
Log.debug("\tnew value: " + field.getValue() + " with type: " + field.getValue().getClass().toString());
}
}
return true;
}
} else {
Log.debug("NOT DIRTY: " + field.getName() + " value: " + field.getValue());
}
}
}
return false;
}
protected void onRender(Element parent, int index)
{
super.onRender(parent, index);
setLayout(new FitLayout());
setId("network-dhcp-nat");
FormData formData = new FormData();
formData.setWidth(250);
m_formPanel = new FormPanel();
m_formPanel.setFrame(false);
m_formPanel.setBodyBorder(false);
m_formPanel.setHeaderVisible(false);
m_formPanel.setLayout(new FlowLayout());
m_formPanel.setStyleAttribute("min-width", "775px");
m_formPanel.setStyleAttribute("padding-left", "30px");
FieldSet fieldSet = new FieldSet();
FormLayout layoutAccount = new FormLayout();
layoutAccount.setLabelWidth(Constants.LABEL_WIDTH_FORM);
fieldSet.setLayout(layoutAccount);
fieldSet.setBorders(false);
//
// Tool Tip Box
//
toolTipField.setText(defaultToolTip);
fieldSet.add(toolTipField);
//
// Router Mode
//
m_modeCombo = new SimpleComboBox<String>();
m_modeCombo.setName("comboMode");
m_modeCombo.setFieldLabel(MSGS.netRouterMode());
m_modeCombo.setEditable(false);
m_modeCombo.setTypeAhead(true);
m_modeCombo.setTriggerAction(TriggerAction.ALL);
for (GwtNetRouterMode mode : GwtNetRouterMode.values()) {
m_modeCombo.add(MessageUtils.get(mode.name()));
}
m_modeCombo.setSimpleValue(MessageUtils.get(GwtNetRouterMode.netRouterDchpNat.name()));
m_modeCombo.setValidator(new Validator() {
public String validate(Field<?> field, String value) {
if (m_tcpIpConfigTab.isDhcp()
&& !value.equals(MessageUtils.get(GwtNetRouterMode.netRouterOff.toString()))){
return MSGS.netRouterConfiguredForDhcpError();
}
return null;
}
});
m_modeCombo.addSelectionChangedListener( new SelectionChangedListener<SimpleComboValue<String>>() {
@Override
public void selectionChanged(SelectionChangedEvent<SimpleComboValue<String>> se) {
refreshForm();
}
});
m_modeCombo.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipMode()));
m_modeCombo.addStyleName("kura-combobox");
m_modeCombo.addPlugin(m_dirtyPlugin);
fieldSet.add(m_modeCombo, formData);
//
// DHCP Beginning Address
//
m_dhcpBeginAddressField = new TextField<String>();
m_dhcpBeginAddressField.setAllowBlank(true);
m_dhcpBeginAddressField.setName("dhcpBeginAddress");
m_dhcpBeginAddressField.setFieldLabel(MSGS.netRouterDhcpBeginningAddress());
m_dhcpBeginAddressField.setRegex(IPV4_REGEX);
m_dhcpBeginAddressField.getMessages().setRegexText(MSGS.netIPv4InvalidAddress());
m_dhcpBeginAddressField.addPlugin(m_dirtyPlugin);
m_dhcpBeginAddressField.setStyleAttribute("margin-top", Constants.LABEL_MARGIN_TOP_SEPARATOR);
m_dhcpBeginAddressField.addStyleName("kura-textfield");
m_dhcpBeginAddressField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipDhcpBeginAddr()));
fieldSet.add(m_dhcpBeginAddressField, formData);
//
// DHCP Ending Address
//
m_dhcpEndAddressField = new TextField<String>();
m_dhcpEndAddressField.setAllowBlank(true);
m_dhcpEndAddressField.setName("dhcpEndAddress");
m_dhcpEndAddressField.setFieldLabel(MSGS.netRouterDhcpEndingAddress());
m_dhcpEndAddressField.setRegex(IPV4_REGEX);
m_dhcpEndAddressField.getMessages().setRegexText(MSGS.netIPv4InvalidAddress());
m_dhcpEndAddressField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipDhcpEndAddr()));
m_dhcpEndAddressField.addStyleName("kura-textfield");;
m_dhcpEndAddressField.addPlugin(m_dirtyPlugin);
fieldSet.add(m_dhcpEndAddressField, formData);
//
// DHCP Subnet Mask
//
m_dhcpSubnetMaskField = new TextField<String>();
m_dhcpSubnetMaskField.setAllowBlank(true);
m_dhcpSubnetMaskField.setName("dhcpSubnetMask");
m_dhcpSubnetMaskField.setFieldLabel(MSGS.netRouterDhcpSubnetMask());
m_dhcpSubnetMaskField.setRegex(IPV4_REGEX);
m_dhcpSubnetMaskField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipDhcpSubnet()));
m_dhcpSubnetMaskField.getMessages().setRegexText(MSGS.netIPv4InvalidAddress());
m_dhcpSubnetMaskField.addStyleName("kura-textfield");
m_dhcpSubnetMaskField.addPlugin(m_dirtyPlugin);
fieldSet.add(m_dhcpSubnetMaskField, formData);
//
// DHCP Default Lease
//
m_dhcpLeaseDefaultField = new NumberField();
m_dhcpLeaseDefaultField.setPropertyEditorType(Integer.class);
m_dhcpLeaseDefaultField.setAllowDecimals(false);
m_dhcpLeaseDefaultField.setAllowNegative(false);
m_dhcpLeaseDefaultField.setMaxValue(Integer.MAX_VALUE);
m_dhcpLeaseDefaultField.setAllowBlank(true);
m_dhcpLeaseDefaultField.setName("dhcpDefaultLease");
m_dhcpLeaseDefaultField.setFieldLabel(MSGS.netRouterDhcpDefaultLease());
m_dhcpLeaseDefaultField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipDhcpDefaultLeaseTime()));
m_dhcpLeaseDefaultField.addPlugin(m_dirtyPlugin);
fieldSet.add(m_dhcpLeaseDefaultField, formData);
//
// DHCP Max Lease
//
m_dhcpLeaseMaxField = new NumberField();
m_dhcpLeaseMaxField.setPropertyEditorType(Integer.class);
m_dhcpLeaseMaxField.setAllowDecimals(false);
m_dhcpLeaseMaxField.setAllowNegative(false);
m_dhcpLeaseMaxField.setMaxValue(Integer.MAX_VALUE);
m_dhcpLeaseMaxField.setAllowBlank(true);
m_dhcpLeaseMaxField.setName("dhcpMaxLease");
m_dhcpLeaseMaxField.setFieldLabel(MSGS.netRouterDhcpMaxLease());
m_dhcpLeaseMaxField.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipDhcpMaxLeaseTime()));
m_dhcpLeaseMaxField.addPlugin(m_dirtyPlugin);
fieldSet.add(m_dhcpLeaseMaxField, formData);
//
// Pass DNS
//
m_passDnsRadioTrue = new Radio();
m_passDnsRadioTrue.setBoxLabel(MSGS.trueLabel());
m_passDnsRadioTrue.setItemId("true");
m_passDnsRadioFalse = new Radio();
m_passDnsRadioFalse.setBoxLabel(MSGS.falseLabel());
m_passDnsRadioFalse.setItemId("false");
m_passDnsRadioGroup = new RadioGroup();
m_passDnsRadioGroup.setName("dhcpPassDns");
m_passDnsRadioGroup.setFieldLabel(MSGS.netRouterPassDns());
m_passDnsRadioGroup.add(m_passDnsRadioTrue);
m_passDnsRadioGroup.add(m_passDnsRadioFalse);
m_passDnsRadioGroup.addPlugin(m_dirtyPlugin);
m_passDnsRadioGroup.addListener(Events.OnMouseOver, new MouseOverListener(MSGS.netRouterToolTipPassDns()));
fieldSet.add(m_passDnsRadioGroup, formData);
m_formPanel.add(fieldSet);
add(m_formPanel);
setScrollMode(Scroll.AUTO);
m_initialized = true;
}
public void refresh()
{
Log.debug("DhcpNatConfigTab.refresh()");
if (m_dirty && m_initialized) {
m_dirty = false;
if (m_selectNetIfConfig == null) {
Log.debug("DhcpNatConfigTab.refresh() - resetting");
reset();
} else {
Log.debug("DhcpNatConfigTab.refresh() - updating");
update();
}
}
}
private void update()
{
if (m_selectNetIfConfig != null) {
Log.debug("in update(): got new netIfConfig for DHCP server for " + m_selectNetIfConfig.getName() + ": " +
"\n\t\trouter mode: " + m_selectNetIfConfig.getRouterMode() +
"\n\t\trouter DHCP start address: " + m_selectNetIfConfig.getRouterDhcpBeginAddress() +
"\n\t\trouter DHCP end address: " + m_selectNetIfConfig.getRouterDhcpEndAddress() +
"\n\t\trouter default lease: " + Integer.toString(m_selectNetIfConfig.getRouterDhcpDefaultLease()) +
"\n\t\trouter max lease: " + Integer.toString(m_selectNetIfConfig.getRouterDhcpMaxLease()) +
"\n\t\trouter Pass DNS: " + Boolean.toString(m_selectNetIfConfig.getRouterDnsPass()));
m_modeCombo.setSimpleValue(MessageUtils.get(m_selectNetIfConfig.getRouterMode()));
m_modeCombo.setOriginalValue(m_modeCombo.getValue());
m_dhcpBeginAddressField.setValue(m_selectNetIfConfig.getRouterDhcpBeginAddress());
m_dhcpBeginAddressField.setOriginalValue(m_dhcpBeginAddressField.getValue());
m_dhcpEndAddressField.setValue(m_selectNetIfConfig.getRouterDhcpEndAddress());
m_dhcpEndAddressField.setOriginalValue(m_dhcpEndAddressField.getValue());
m_dhcpSubnetMaskField.setValue(m_selectNetIfConfig.getRouterDhcpSubnetMask());
m_dhcpSubnetMaskField.setOriginalValue(m_dhcpSubnetMaskField.getValue());
m_dhcpLeaseDefaultField.setValue(m_selectNetIfConfig.getRouterDhcpDefaultLease());
m_dhcpLeaseDefaultField.setOriginalValue(m_dhcpLeaseDefaultField.getValue());
m_dhcpLeaseMaxField.setValue(m_selectNetIfConfig.getRouterDhcpMaxLease());
m_dhcpLeaseMaxField.setOriginalValue(m_dhcpLeaseMaxField.getValue());
if (m_selectNetIfConfig.getRouterDnsPass()) {
m_passDnsRadioTrue.setValue(true);
m_passDnsRadioTrue.setOriginalValue(m_passDnsRadioTrue.getValue());
m_passDnsRadioFalse.setValue(false);
m_passDnsRadioFalse.setOriginalValue(m_passDnsRadioFalse.getValue());
m_passDnsRadioGroup.setOriginalValue(m_passDnsRadioTrue);
m_passDnsRadioGroup.setValue(m_passDnsRadioGroup.getValue());
}
else {
m_passDnsRadioTrue.setValue(false);
m_passDnsRadioTrue.setOriginalValue(m_passDnsRadioTrue.getValue());
m_passDnsRadioFalse.setValue(true);
m_passDnsRadioFalse.setOriginalValue(m_passDnsRadioFalse.getValue());
m_passDnsRadioGroup.setOriginalValue(m_passDnsRadioFalse);
m_passDnsRadioGroup.setValue(m_passDnsRadioGroup.getValue());
}
} else {
Log.debug("selected Network Interface Config is null");
}
for (Field<?> field : m_formPanel.getFields()) {
FormUtils.removeDirtyFieldIcon(field);
}
refreshForm();
}
private void refreshForm() {
if (m_formPanel != null) {
if (!m_tcpIpConfigTab.isLanEnabled()) {
for (Field<?> field : m_formPanel.getFields()) {
field.setEnabled(false);
}
}
else {
GwtWifiWirelessMode wirelessMode = m_wirelessConfigTab.getWirelessMode();
if (m_selectNetIfConfig.getHwTypeEnum() == GwtNetIfType.WIFI && (wirelessMode == GwtWifiWirelessMode.netWifiWirelessModeStation ||
wirelessMode == GwtWifiWirelessMode.netWifiWirelessModeDisabled))
{
for (Field<?> field : m_formPanel.getFields()) {
field.setEnabled(false);
}
} else {
for (Field<?> field : m_formPanel.getFields()) {
field.setEnabled(true);
field.validate();
}
String modeValue = m_modeCombo.getValue().getValue();
if (modeValue == MessageUtils.get(GwtNetRouterMode.netRouterNat.name()) ||
modeValue == MessageUtils.get(GwtNetRouterMode.netRouterOff.name()))
{
for (Field<?> field : m_formPanel.getFields()) {
if (field != m_modeCombo) {
field.setEnabled(false);
}
}
}
else {
for (Field<?> field : m_formPanel.getFields()) {
if (field != m_modeCombo) {
field.setEnabled(true);
}
}
}
}
}
}
}
private void reset()
{
Log.debug("DhcpNatConfigTab: reset()");
m_modeCombo.setSimpleValue(MessageUtils.get(GwtNetRouterMode.netRouterOff.name()));
m_modeCombo.setOriginalValue(m_modeCombo.getValue());
m_dhcpBeginAddressField.setValue("");
m_dhcpBeginAddressField.setOriginalValue(m_dhcpBeginAddressField.getValue());
m_dhcpEndAddressField.setValue("");
m_dhcpEndAddressField.setOriginalValue(m_dhcpEndAddressField.getValue());
m_dhcpSubnetMaskField.setValue("");
m_dhcpSubnetMaskField.setOriginalValue(m_dhcpSubnetMaskField.getValue());
m_dhcpLeaseDefaultField.setValue(0);
m_dhcpLeaseDefaultField.setOriginalValue(m_dhcpLeaseDefaultField.getValue());
m_dhcpLeaseMaxField.setValue(0);
m_dhcpLeaseMaxField.setOriginalValue(m_dhcpLeaseMaxField.getValue());
m_passDnsRadioTrue.setValue(false);
m_passDnsRadioTrue.setOriginalValue(m_passDnsRadioTrue.getValue());
m_passDnsRadioFalse.setValue(true);
m_passDnsRadioFalse.setOriginalValue(m_passDnsRadioFalse.getValue());
m_passDnsRadioGroup.setValue(m_passDnsRadioFalse);
m_passDnsRadioGroup.setOriginalValue(m_passDnsRadioGroup.getValue());
update();
}
}