/*******************************************************************************
* Copyright 2017 Capital One Services, LLC and Bitwise, Inc.
* Licensed 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 hydrograph.ui.dataviewer.preferencepage;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import hydrograph.ui.common.swt.customwidget.HydroGroup;
import hydrograph.ui.common.util.Constants;
import hydrograph.ui.common.util.PreferenceConstants;
import hydrograph.ui.dataviewer.constants.Messages;
/**
* @author Bitwise
* ServicesPreference Class creates preference page for
* defining common parameters for view data and execution
* tracking service.
*
*/
public class ServicesPreference extends PreferencePage implements IWorkbenchPreferencePage {
private Composite grpServiceDetailsCmposite;
private IntegerFieldEditor localPortNo;
private IntegerFieldEditor remotePortNo;
private List<FieldEditor> editorList;
private BooleanFieldEditor useRemoteConfigBooleanFieldEditor;
private StringFieldEditor remoteHostFieldEditor;
private Button useRemoteConfigbutton;
private static final String DEFAULT_LOCAL_PORT = "8004";
private static final String DEFAULT_REMOTE_PORT = "8004";
private static final boolean DEFAULT_USE_REMOTE_CONFIGURATION_CHECK = false;
public ServicesPreference() {
super();
setPreferenceStore(PlatformUI.getWorkbench().getPreferenceStore());
}
/*
* Set default values
*/
@Override
public void init(IWorkbench workbench) {
IPreferenceStore preferenceStore =PlatformUI.getPreferenceStore();
preferenceStore.setDefault(PreferenceConstants.LOCAL_PORT_NO, DEFAULT_LOCAL_PORT);
preferenceStore.setDefault(PreferenceConstants.REMOTE_PORT_NO, DEFAULT_REMOTE_PORT);
preferenceStore.setDefault(PreferenceConstants.USE_REMOTE_CONFIGURATION, DEFAULT_USE_REMOTE_CONFIGURATION_CHECK);
setPreferenceStore(preferenceStore);
}
/* Creates contents of the preference page
*
*/
@Override
protected Control createContents(Composite parent) {
final Composite parentComposite = new Composite(parent, SWT.None);
parentComposite.setToolTipText("Export Data");
GridData parentCompositeData = new GridData(SWT.FILL, SWT.BEGINNING, true, true, 3, 3);
parentCompositeData.grabExcessHorizontalSpace = true;
parentCompositeData.grabExcessVerticalSpace = true;
parentComposite.setLayout(new GridLayout(1, false));
parentComposite.setLayoutData(parentCompositeData);
HydroGroup grpServiceDetails = new HydroGroup(parentComposite, SWT.NONE);
grpServiceDetails.setHydroGroupText("Port and Remote Host Details");
GridLayout gl_grpServiceDetails = new GridLayout(1, false);
GridData gd_grpServiceDetailsData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
grpServiceDetails.setLayout(new GridLayout(1,false));
grpServiceDetails.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
grpServiceDetails.getHydroGroupClientArea().setLayout(gl_grpServiceDetails);
grpServiceDetails.getHydroGroupClientArea().setLayoutData(gd_grpServiceDetailsData);
grpServiceDetailsCmposite = new Composite(grpServiceDetails.getHydroGroupClientArea(), SWT.NONE);
GridData serviceGridData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
grpServiceDetailsCmposite.setLayout(new GridLayout(1,false));
grpServiceDetailsCmposite.setLayoutData(serviceGridData);
localPortNo = new IntegerFieldEditor(PreferenceConstants.LOCAL_PORT_NO, Messages.LOCAL_PORT_NO_LABEL, grpServiceDetailsCmposite, 5);
localPortNo.getTextControl(grpServiceDetailsCmposite).addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent event) {
String value = ((Text)event.getSource()).getText();
validatePortField(value,localPortNo,Messages.PORTNO_FIELD_VALIDATION);
}
});
localPortNo.getTextControl(grpServiceDetailsCmposite).addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) { }
@Override
public void focusGained(FocusEvent event) {
String value = ((Text)event.getSource()).getText();
validatePortField(value,localPortNo,Messages.PORTNO_FIELD_VALIDATION);
}
});
localPortNo.setPreferenceStore(getPreferenceStore());
localPortNo.load();
remotePortNo = new IntegerFieldEditor(PreferenceConstants.REMOTE_PORT_NO, Messages.REMOTE_PORT_NO_LABEL, grpServiceDetailsCmposite, 5);
remotePortNo.getTextControl(grpServiceDetailsCmposite).addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent event) {
String value = ((Text)event.getSource()).getText();
validatePortField(value,remotePortNo,Messages.PORTNO_FIELD_VALIDATION);
}
});
remotePortNo.getTextControl(grpServiceDetailsCmposite).addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) { }
@Override
public void focusGained(FocusEvent event) {
String value = ((Text)event.getSource()).getText();
validatePortField(value,remotePortNo,Messages.PORTNO_FIELD_VALIDATION);
}
});
remotePortNo.setPreferenceStore(getPreferenceStore());
remotePortNo.load();
new Label(grpServiceDetailsCmposite, SWT.None).setText(Messages.OVERRIDE_REMOTE_HOST_LABEL);
Composite headerRemoteComposite = new Composite(grpServiceDetailsCmposite, SWT.None);
useRemoteConfigBooleanFieldEditor = new BooleanFieldEditor(PreferenceConstants.USE_REMOTE_CONFIGURATION, "", SWT.DEFAULT, headerRemoteComposite);
useRemoteConfigbutton = (Button) useRemoteConfigBooleanFieldEditor.getDescriptionControl(headerRemoteComposite);
getPreferenceStore().setDefault(PreferenceConstants.USE_REMOTE_CONFIGURATION, false);
useRemoteConfigBooleanFieldEditor.setPreferenceStore(getPreferenceStore());
useRemoteConfigBooleanFieldEditor.load();
addListenerToRemoteConfigBooleanEditor(headerRemoteComposite);
remoteHostFieldEditor = new StringFieldEditor(PreferenceConstants.REMOTE_HOST, Messages.REMOTE_HOST_NAME_LABEL, grpServiceDetailsCmposite);
remoteHostFieldEditor.getTextControl(grpServiceDetailsCmposite).addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
validateRemoteHost();
}
});
remoteHostFieldEditor.setPreferenceStore(getPreferenceStore());
remoteHostFieldEditor.load();
remoteHostFieldEditor.setErrorMessage(null);
addFields(localPortNo);
addFields(remotePortNo);
addFields(remoteHostFieldEditor);
return null;
}
/*
* Saves the preferences on ok button click
*/
@Override
public boolean performOk() {
localPortNo.getStringValue();
localPortNo.store();
remotePortNo.store();
remoteHostFieldEditor.store();
useRemoteConfigBooleanFieldEditor.store();
return super.performOk();
}
/*
* Apply the preferences
*/
@Override
protected void performApply() {
localPortNo.store();
remotePortNo.store();
useRemoteConfigBooleanFieldEditor.store();
remoteHostFieldEditor.store();
}
/*
* Set defaults values
*/
@Override
protected void performDefaults() {
IPreferenceStore preferenceStore = getPreferenceStore();
localPortNo.setStringValue(preferenceStore.getDefaultString(PreferenceConstants.LOCAL_PORT_NO));
remotePortNo.setStringValue(preferenceStore.getDefaultString(PreferenceConstants.REMOTE_PORT_NO));
useRemoteConfigBooleanFieldEditor.loadDefault();
super.performDefaults();
}
/**
* @param value
* @param editor
* @param message
* Validates port values
*/
private void validatePortField(String value, IntegerFieldEditor editor, String message){
if(StringUtils.isBlank(value) || !value.matches(Constants.PORT_VALIDATION_REGEX)){
showErrorMessage(editor, message,false);
}else{
showErrorMessage(editor, null,true);
checkState();
}
}
/**
* @param editor
* @param message
* @param validState
* Display error message
*/
private void showErrorMessage(IntegerFieldEditor editor, String message,boolean validState) {
setErrorMessage(message);
editor.setErrorMessage(message);
setValid(validState);
}
/**
* Check if all fields are valid
*
*/
private void checkState() {
if(editorList != null){
int size = editorList.size();
for(int i=0; i<size; i++){
FieldEditor fieldEditor = editorList.get(i);
if(StringUtils.isNotBlank(((StringFieldEditor)fieldEditor).getErrorMessage())){
setErrorMessage(((StringFieldEditor)fieldEditor).getErrorMessage());
setValid(false);
break;
}else{
setValid(true);
}
}
}
}
/**
* Add fields to list
*/
private void addFields(FieldEditor editor){
if (editorList == null) {
editorList = new ArrayList<>();
}
editorList.add(editor);
}
/**
* Listner on check box to validate remote host
*/
private void addListenerToRemoteConfigBooleanEditor(Composite headerRemoteComposite) {
useRemoteConfigbutton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
validateRemoteHost();
}
});
}
/**
* check if remote host name is valid
*/
private void validateRemoteHost() {
if(useRemoteConfigbutton.getSelection() && StringUtils.isEmpty(remoteHostFieldEditor.getStringValue())){
remoteHostFieldEditor.setErrorMessage(Messages.BLANK_REMOTE_HOST_NAME_ERROR);
checkState();
}else{
setErrorMessage(null);
remoteHostFieldEditor.setErrorMessage("");
setValid(true);
checkState();;
}
}
/*
* Returns preference store
*/
@Override
public IPreferenceStore getPreferenceStore() {
return PlatformUI.getPreferenceStore();
}
}