/******************************************************************************* * 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 hydrograph.ui.common.swt.customwidget.HydroGroup; import hydrograph.ui.common.util.Constants; import hydrograph.ui.common.util.ConvertHexValues; import hydrograph.ui.common.util.PreferenceConstants; import hydrograph.ui.dataviewer.Activator; import hydrograph.ui.dataviewer.constants.Messages; import hydrograph.ui.dataviewer.utilities.Utils; import hydrograph.ui.propertywindow.runconfig.Notification; 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.DirectoryFieldEditor; 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.graphics.Font; import org.eclipse.swt.graphics.FontData; 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; /** * The Class ViewDataPreference. * Creates View Data Preferences window. * * @author Bitwise * */ public class ViewDataPreference extends PreferencePage implements IWorkbenchPreferencePage{ private static final String DEFAULT_QUOTE_CHARACTOR = "\""; private static final String DEFAULT_DELIMITER = ","; private static final String DEFAULT_VIEW_DATA_FILE_SIZE = "100"; private static final String DEFAULT_VIEW_DATA_PAGE_SIZE = "100"; private static final boolean DEFAULT_PURGE_DATA_FILES_CHECK = true; private static final boolean DEFAULT_INCLUDE_HEADER_CHECK = true; private static final String DEFAULTPATH_VALUE = ""; private BooleanFieldEditor booleanFieldEditor; private IntegerFieldEditor pageSizeEditor; private StringFieldEditor delimiterEditor; private IntegerFieldEditor memoryFieldEditor; private StringFieldEditor quoteEditor; private DirectoryFieldEditor tempPathFieldEditor; private DirectoryFieldEditor defaultPathFieldEditor; private BooleanFieldEditor purgeEditor; private List<FieldEditor> editorList; public ViewDataPreference() { super(); setPreferenceStore(PlatformUI.getWorkbench().getPreferenceStore()); } /** * Create contents of the dialog. * * @param parent */ @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 generalGroup = new HydroGroup(parentComposite, SWT.NONE); generalGroup.setHydroGroupText("General"); GridLayout generalGroupLayout = new GridLayout(4, false); generalGroupLayout.verticalSpacing = 0; generalGroupLayout.marginHeight = 0; generalGroupLayout.horizontalSpacing = 0; GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, true, 3, 3); gridData.heightHint =145; gridData.widthHint = 580; gridData.horizontalSpan = 3; gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = true; generalGroup.setLayout(new GridLayout(1,false)); generalGroup.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, true, 1, 1)); generalGroup.getHydroGroupClientArea().setLayout(generalGroupLayout); generalGroup.getHydroGroupClientArea().setLayoutData(gridData); memoryFieldEditor =new IntegerFieldEditor(PreferenceConstants.VIEW_DATA_FILE_SIZE, " File Size (MB)", generalGroup.getHydroGroupClientArea(), 6); memoryFieldEditor.setErrorMessage(null); memoryFieldEditor.setFocus(); memoryFieldEditor.getTextControl(generalGroup.getHydroGroupClientArea()).addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { String value = ((Text)event.getSource()).getText(); validationForIntegerField(value, memoryFieldEditor, Messages.FILE_INTEGER_FIELD_VALIDATION); } }); memoryFieldEditor.getTextControl(generalGroup.getHydroGroupClientArea()).addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { } @Override public void focusGained(FocusEvent event) { String value = ((Text)event.getSource()).getText(); validationForIntegerField(value, memoryFieldEditor, Messages.FILE_INTEGER_FIELD_VALIDATION); } }); memoryFieldEditor.setPreferenceStore(getPreferenceStore()); memoryFieldEditor.load(); Button unusedButton0 = new Button(generalGroup.getHydroGroupClientArea(), SWT.None); unusedButton0.setText("unused"); unusedButton0.setBounds(0, 0, 20, 10); unusedButton0.setVisible(false); pageSizeEditor = new IntegerFieldEditor(PreferenceConstants.VIEW_DATA_PAGE_SIZE, " Page Size", generalGroup.getHydroGroupClientArea(), 6); pageSizeEditor.setErrorMessage(null); pageSizeEditor.setFocus(); pageSizeEditor.setPreferenceStore(getPreferenceStore()); pageSizeEditor.load(); Button unusedButton1 = new Button(generalGroup.getHydroGroupClientArea(), SWT.None); unusedButton1.setText("unused"); unusedButton1.setBounds(0, 0, 20, 10); unusedButton1.setVisible(false); pageSizeEditor.getTextControl(generalGroup.getHydroGroupClientArea()).addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { String value = ((Text)event.getSource()).getText(); validationForIntegerField(value, pageSizeEditor, Messages.PAGE_INTEGER_FIELD_VALIDATION); } }); pageSizeEditor.getTextControl(generalGroup.getHydroGroupClientArea()).addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { } @Override public void focusGained(FocusEvent event) { String value = ((Text)event.getSource()).getText(); validationForIntegerField(value, pageSizeEditor, Messages.PAGE_INTEGER_FIELD_VALIDATION); } }); tempPathFieldEditor = new DirectoryFieldEditor(PreferenceConstants.VIEW_DATA_TEMP_FILEPATH, " Local Temp Path", generalGroup.getHydroGroupClientArea()); tempPathFieldEditor.setPreferenceStore(getPreferenceStore()); tempPathFieldEditor.setFocus(); tempPathFieldEditor.setErrorMessage(null); tempPathFieldEditor.load(); Composite compositeInGeneral = new Composite(generalGroup.getHydroGroupClientArea(), SWT.None); GridData gdcompositeNote = new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1); gdcompositeNote.heightHint = 16; gdcompositeNote.widthHint = 500; compositeInGeneral.setLayoutData(gdcompositeNote); Label lblNote = new Label(compositeInGeneral, SWT.WRAP); lblNote.setBounds(4, 0, 40, 20); lblNote.setText("Note : "); FontData fontData = lblNote.getFont().getFontData()[0]; Font font = new Font(compositeInGeneral.getDisplay(), new FontData(fontData.getName(), fontData.getHeight(), SWT.BOLD)); lblNote.setFont(font); Label lblmsg = new Label(compositeInGeneral, SWT.WRAP); lblmsg.setBounds(44, 0, 308, 18); lblmsg.setText(Messages.MEMORY_OVERFLOW_EXCEPTION); /*Export Data section*/ HydroGroup grpExportData = new HydroGroup(parentComposite, SWT.NONE); grpExportData.setHydroGroupText("Export Data"); GridLayout grpExportLayout = new GridLayout(); grpExportLayout.verticalSpacing = 0; grpExportLayout.marginWidth = 0; grpExportLayout.marginHeight = 0; grpExportLayout.horizontalSpacing = 0; GridData gd_grpExportData = new GridData(SWT.FILL, SWT.BEGINNING, true, true, 3, 3); gd_grpExportData.widthHint = 590; gd_grpExportData.heightHint = 170; gd_grpExportData.grabExcessHorizontalSpace = true; gd_grpExportData.grabExcessVerticalSpace = true; grpExportData.setLayout(new GridLayout(1,false)); grpExportData.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, true,1,1)); grpExportData.getHydroGroupClientArea().setLayoutData(gd_grpExportData); grpExportData.getHydroGroupClientArea().setLayout(grpExportLayout); delimiterEditor = new StringFieldEditor(PreferenceConstants.DELIMITER, " Delimiter", grpExportData.getHydroGroupClientArea()); delimiterEditor.setErrorMessage(null); delimiterEditor.setFocus(); delimiterEditor.getTextControl(grpExportData.getHydroGroupClientArea()).addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { } @Override public void focusGained(FocusEvent event) { Notification note = validateDelimiter(); if(note.hasErrors()){ setValid(false); delimiterEditor.setErrorMessage(note.errorMessage()); setErrorMessage(note.errorMessage()); }else{ setErrorMessage(null); delimiterEditor.setErrorMessage(""); checkState(); } } }); delimiterEditor.setPreferenceStore(getPreferenceStore()); delimiterEditor.load(); Button unusedButton2 = new Button(grpExportData.getHydroGroupClientArea(), SWT.None); unusedButton2.setText("unused"); unusedButton2.setVisible(false); quoteEditor = new StringFieldEditor(PreferenceConstants.QUOTE_CHARACTOR, " Quote Character", grpExportData.getHydroGroupClientArea()); quoteEditor.setErrorMessage(null); quoteEditor.setFocus(); quoteEditor.getTextControl(grpExportData.getHydroGroupClientArea()).addModifyListener(new ModifyListener(){ @Override public void modifyText(ModifyEvent e) { Notification note1 = validateDelimiter(); if(note1.hasErrors()){ setValid(false); delimiterEditor.setErrorMessage(note1.errorMessage()); setErrorMessage(note1.errorMessage()); }else{ setErrorMessage(null); delimiterEditor.setErrorMessage(""); checkState(); } Notification note =validateQuoteCharacter(); if(note.hasErrors()){ setValid(false); quoteEditor.setErrorMessage(note.errorMessage()); setErrorMessage(note.errorMessage()); }else{ setErrorMessage(null); quoteEditor.setErrorMessage(""); checkState(); } } }); quoteEditor.getTextControl(grpExportData.getHydroGroupClientArea()).addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { } @Override public void focusGained(FocusEvent event) { Notification note =validateQuoteCharacter(); if(note.hasErrors()){ setValid(false); quoteEditor.setErrorMessage(note.errorMessage()); setErrorMessage(note.errorMessage()); }else{ setErrorMessage(null); quoteEditor.setErrorMessage(""); checkState(); } } }); delimiterEditor.getTextControl(grpExportData.getHydroGroupClientArea()).addModifyListener(new ModifyListener(){ @Override public void modifyText(ModifyEvent e) { Notification note = validateDelimiter(); if(note.hasErrors()){ setValid(false); delimiterEditor.setErrorMessage(note.errorMessage()); setErrorMessage(note.errorMessage()); }else{ setErrorMessage(null); delimiterEditor.setErrorMessage(""); checkState(); } Notification note1 =validateQuoteCharacter(); if(note1.hasErrors()){ setValid(false); quoteEditor.setErrorMessage(note1.errorMessage()); setErrorMessage(note1.errorMessage()); }else{ setErrorMessage(null); quoteEditor.setErrorMessage(""); checkState(); } } }); quoteEditor.setPreferenceStore(getPreferenceStore()); quoteEditor.load(); Button unusedButton3 =new Button(grpExportData.getHydroGroupClientArea(), SWT.None); unusedButton3.setText(""); unusedButton3.setVisible(false); defaultPathFieldEditor = new DirectoryFieldEditor(PreferenceConstants.DEFAULTPATH, " Default Path", grpExportData.getHydroGroupClientArea()); defaultPathFieldEditor.setErrorMessage(null); defaultPathFieldEditor.setFocus(); defaultPathFieldEditor.setPreferenceStore(getPreferenceStore()); defaultPathFieldEditor.load(); new Label(grpExportData.getHydroGroupClientArea(), SWT.None).setText(" Include Header "); Composite headerComposite = new Composite(grpExportData.getHydroGroupClientArea(), SWT.None); headerComposite.setBounds(0, 0, 20, 16); Composite com = new Composite(grpExportData.getHydroGroupClientArea(), SWT.None); GridData gd = new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1); gd.heightHint = 20; gd.widthHint = 600; com.setLayoutData(gd); Label lb = new Label(com, SWT.None); lb.setBounds(4, 4, 38, 16); lb.setText("Note : "); FontData messageFontData = lblNote.getFont().getFontData()[0]; Font messageFont = new Font(compositeInGeneral.getDisplay(), new FontData(messageFontData.getName(), messageFontData.getHeight(), SWT.BOLD)); lb.setFont(messageFont); Label labelMsg = new Label(com, SWT.None); labelMsg.setBounds(42, 4, 500, 16); labelMsg.setText(Messages.WARNING_MESSAGE); headerComposite.setBounds(0, 0, 20, 16); booleanFieldEditor = new BooleanFieldEditor(PreferenceConstants.INCLUDE_HEADER, "", SWT.DEFAULT, headerComposite); getPreferenceStore().setDefault(PreferenceConstants.INCLUDE_HEADER, true); booleanFieldEditor.setPreferenceStore(getPreferenceStore()); booleanFieldEditor.setPreferenceStore(getPreferenceStore()); booleanFieldEditor.load(); Composite parent_comp= new Composite(parentComposite, SWT.NONE); parent_comp.setLayout(new GridLayout(3, false)); new Label(parent_comp, SWT.NONE).setText("Purge View Data Files "); Composite purgeComposite = new Composite(parent_comp, SWT.NONE); purgeComposite.setLayout(new GridLayout(1, false)); purgeEditor = new BooleanFieldEditor(PreferenceConstants.PURGE_DATA_FILES, "", purgeComposite); getPreferenceStore().setDefault(PreferenceConstants.PURGE_DATA_FILES, true); purgeEditor.setPreferenceStore(getPreferenceStore()); purgeEditor.load(); addFields(memoryFieldEditor); addFields(delimiterEditor); addFields(pageSizeEditor); addFields(quoteEditor); return null; } private void addFields(FieldEditor editor){ if (editorList == null) { editorList = new ArrayList<>(); } editorList.add(editor); } 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); } } } } private Notification validateDelimiter(){ Notification notification = new Notification(); if(StringUtils.isNotBlank(delimiterEditor.getStringValue()) &&delimiterEditor.getStringValue().equalsIgnoreCase(quoteEditor.getStringValue())){ notification.addError(Messages.DELIMITER_VALUE_MATCH_ERROR); } if(StringUtils.length(ConvertHexValues.parseHex(delimiterEditor.getStringValue())) != 1){ notification.addError(Messages.DELIMITER_SINGLE_CHARACTOR_ERROR_MESSAGE); } return notification; } private Notification validateQuoteCharacter(){ Notification notification = new Notification(); if(StringUtils.isNotBlank(quoteEditor.getStringValue()) && quoteEditor.getStringValue().equalsIgnoreCase(delimiterEditor.getStringValue())){ notification.addError(Messages.QUOTE_VALUE_MATCH_ERROR); } if(StringUtils.length(ConvertHexValues.parseHex(quoteEditor.getStringValue())) != 1){ notification.addError(Messages.QUOTE_SINGLE_CHARACTOR_ERROR_MESSAGE); } return notification; } private void validationForIntegerField(String value, IntegerFieldEditor editor, String message){ if(StringUtils.isBlank(value) || !value.matches("\\d+") || value.equalsIgnoreCase("0")){ setErrorMessage(message); editor.setErrorMessage(message); setValid(false); }else{ setErrorMessage(null); editor.setErrorMessage(""); setValid(true); checkState(); } } 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(); } } private void showErrorMessage(IntegerFieldEditor editor, String message,boolean validState) { setErrorMessage(message); editor.setErrorMessage(message); setValid(validState); } @Override public void init(IWorkbench workbench) { IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); preferenceStore.setDefault(PreferenceConstants.VIEW_DATA_TEMP_FILEPATH, Utils.INSTANCE.getDataViewerDebugFilePath()); preferenceStore.setDefault(PreferenceConstants.DEFAULTPATH, DEFAULTPATH_VALUE); preferenceStore.setDefault(PreferenceConstants.VIEW_DATA_FILE_SIZE, DEFAULT_VIEW_DATA_FILE_SIZE); preferenceStore.setDefault(PreferenceConstants.VIEW_DATA_PAGE_SIZE, DEFAULT_VIEW_DATA_PAGE_SIZE); preferenceStore.setDefault(PreferenceConstants.DELIMITER, DEFAULT_DELIMITER); preferenceStore.setDefault(PreferenceConstants.QUOTE_CHARACTOR, DEFAULT_QUOTE_CHARACTOR); preferenceStore.setDefault(PreferenceConstants.INCLUDE_HEADER, DEFAULT_INCLUDE_HEADER_CHECK); preferenceStore.setDefault(PreferenceConstants.PURGE_DATA_FILES, DEFAULT_PURGE_DATA_FILES_CHECK); setPreferenceStore(preferenceStore); } @Override protected void performDefaults() { IPreferenceStore preferenceStore = getPreferenceStore(); tempPathFieldEditor.setStringValue(preferenceStore.getDefaultString(PreferenceConstants.VIEW_DATA_TEMP_FILEPATH)); defaultPathFieldEditor.setStringValue(preferenceStore.getDefaultString(PreferenceConstants.DEFAULTPATH)); pageSizeEditor.setStringValue(preferenceStore.getDefaultString(PreferenceConstants.VIEW_DATA_PAGE_SIZE)); memoryFieldEditor.setStringValue(preferenceStore.getDefaultString(PreferenceConstants.VIEW_DATA_FILE_SIZE)); delimiterEditor.setStringValue(preferenceStore.getDefaultString(PreferenceConstants.DELIMITER)); quoteEditor.setStringValue(preferenceStore.getDefaultString(PreferenceConstants.QUOTE_CHARACTOR)); booleanFieldEditor.loadDefault(); purgeEditor.loadDefault(); loadDefaultToRemoteHostEditor(); } private void loadDefaultToRemoteHostEditor() { setErrorMessage(null); setValid(true); checkState();; } @Override protected void performApply() { memoryFieldEditor.store(); pageSizeEditor.store(); delimiterEditor.store(); quoteEditor.store(); tempPathFieldEditor.store(); defaultPathFieldEditor.store(); booleanFieldEditor.store(); pageSizeEditor.store(); } @Override public boolean performOk() { memoryFieldEditor.store(); pageSizeEditor.store(); delimiterEditor.store(); quoteEditor.store(); tempPathFieldEditor.store(); defaultPathFieldEditor.store(); booleanFieldEditor.store(); purgeEditor.store(); return super.performOk(); } }