hydrograph.ui.dataviewer.preferencepage.ViewDataPreferencesDialog.java Source code

Java tutorial

Introduction

Here is the source code for hydrograph.ui.dataviewer.preferencepage.ViewDataPreferencesDialog.java

Source

/*******************************************************************************
 * 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.util.ConvertHexValues;
import hydrograph.ui.common.util.ImagePathConstant;
import hydrograph.ui.common.util.XMLConfigUtil;
import hydrograph.ui.dataviewer.Activator;
import hydrograph.ui.dataviewer.constants.Messages;

import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.resource.ImageDescriptor;
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.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
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.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.internal.util.BundleUtility;
import org.osgi.framework.Bundle;

/**
 * This class is responsible for making dialog of view data preferences
 * 
 * @author Bitwise
 *
 */
public class ViewDataPreferencesDialog extends Dialog {
    private Label warningImageLabel;
    private Label warningLabel;
    private Text delimiterTextBox;
    private Text quoteCharactorTextBox;
    private Button includeHeardersCheckBox;
    private Text fileSizeTextBox;
    private Text pageSizeTextBox;
    private ViewDataPreferencesVO viewDataPreferencesVO;
    private ControlDecoration pageSizeIntegerDecorator;
    private ControlDecoration fileSizeIntegerDecorator;
    private ControlDecoration fileSizeEmptyDecorator;
    private ControlDecoration pageSizeEmptyDecorator;
    private ControlDecoration delimiterDuplicateDecorator;
    private ControlDecoration delimiterSingleCharactorDecorator;
    private ControlDecoration quoteSingleCharactorDecorator;
    private ControlDecoration quoteCharactorDuplicateDecorator;
    private ControlDecoration delimiterEmptyDecorator;
    private ControlDecoration quoteCharactorEmptyDecorator;
    private ControlDecoration fileSizeZeroDecorator;
    private ControlDecoration pageSizeZeroDecorator;
    private String REGEX = "[\\d]*";

    /**
     * Create the dialog.
     * 
     * @param parentShell
     */
    public ViewDataPreferencesDialog(Shell parentShell) {
        super(parentShell);

    }

    /**
     * Create contents of the dialog.
     * 
     * @param parent
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        Composite container = (Composite) super.createDialogArea(parent);
        container.getShell().setText("View Data Preferences");
        container.setLayout(new GridLayout(2, false));
        Composite composite = new Composite(container, SWT.BORDER);
        GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 2);
        gd_composite.widthHint = 619;
        composite.setLayoutData(gd_composite);
        Label delimiterLabel = new Label(composite, SWT.NONE);
        delimiterLabel.setBounds(22, 22, 55, 15);
        delimiterLabel.setText("Delimiter");
        setCursorTooltip(delimiterLabel, Messages.DELIMITER_HELP_TEXT);

        Label quoteCharactorLabel = new Label(composite, SWT.NONE);
        quoteCharactorLabel.setBounds(22, 61, 94, 15);
        quoteCharactorLabel.setText("Quote Character");
        setCursorTooltip(quoteCharactorLabel, Messages.QUOTE_CHARACTOR_HELP_TEXT);

        delimiterTextBox = new Text(composite, SWT.BORDER);
        delimiterTextBox.setBounds(132, 19, 86, 21);

        quoteCharactorTextBox = new Text(composite, SWT.BORDER);
        quoteCharactorTextBox.setBounds(132, 58, 86, 21);

        includeHeardersCheckBox = new Button(composite, SWT.CHECK);
        includeHeardersCheckBox.setBounds(578, 21, 109, 16);
        includeHeardersCheckBox.setText("Include Headers");
        setCursorTooltip(includeHeardersCheckBox, Messages.INCLUDE_HEADER_HELP_TEXT);

        Label fileSizeLabel = new Label(composite, SWT.NONE);
        fileSizeLabel.setBounds(301, 22, 76, 15);
        fileSizeLabel.setText("File Size (MB)");
        setCursorTooltip(fileSizeLabel, Messages.FILE_SIZE_HELP_TEXT);

        Label pageSizeLabel = new Label(composite, SWT.NONE);
        pageSizeLabel.setBounds(301, 61, 55, 15);
        pageSizeLabel.setText("Page Size");
        setCursorTooltip(pageSizeLabel, Messages.PAGE_SIZE_HELP_TEXT);
        fileSizeTextBox = new Text(composite, SWT.BORDER);
        fileSizeTextBox.setBounds(414, 19, 76, 21);

        pageSizeTextBox = new Text(composite, SWT.BORDER);
        pageSizeTextBox.setBounds(414, 58, 76, 21);
        delimiterTextBox.setText(viewDataPreferencesVO.getDelimiter());
        quoteCharactorTextBox.setText(viewDataPreferencesVO.getQuoteCharactor());
        includeHeardersCheckBox.setSelection(viewDataPreferencesVO.getIncludeHeaders());
        fileSizeTextBox.setText(Integer.toString(viewDataPreferencesVO.getFileSize()));
        pageSizeTextBox.setText(Integer.toString(viewDataPreferencesVO.getPageSize()));
        fileSizeIntegerDecorator = addDecorator(fileSizeTextBox, Messages.NUMERIC_VALUE_ACCPECTED);
        pageSizeIntegerDecorator = addDecorator(pageSizeTextBox, Messages.NUMERIC_VALUE_ACCPECTED);
        fileSizeEmptyDecorator = addDecorator(fileSizeTextBox, Messages.FILE_SIZE_BLANK);
        pageSizeEmptyDecorator = addDecorator(pageSizeTextBox, Messages.PAGE_SIZE_BLANK);
        delimiterDuplicateDecorator = addDecorator(delimiterTextBox, Messages.DUPLICATE_ERROR_MESSAGE);
        delimiterSingleCharactorDecorator = addDecorator(delimiterTextBox, Messages.SINGLE_CHARACTOR_ERROR_MESSAGE);
        quoteSingleCharactorDecorator = addDecorator(quoteCharactorTextBox,
                Messages.SINGLE_CHARACTOR_ERROR_MESSAGE);
        quoteCharactorDuplicateDecorator = addDecorator(quoteCharactorTextBox, Messages.DUPLICATE_ERROR_MESSAGE);
        delimiterEmptyDecorator = addDecorator(delimiterTextBox, Messages.DELIMITER_BLANK);
        quoteCharactorEmptyDecorator = addDecorator(quoteCharactorTextBox, Messages.QUOTE_CHARACTOR_BLANK);
        fileSizeZeroDecorator = addDecorator(fileSizeTextBox, Messages.NUMERIC_VALUE_ACCPECTED);
        pageSizeZeroDecorator = addDecorator(pageSizeTextBox, Messages.NUMERIC_VALUE_ACCPECTED);
        pageSizeIntegerDecorator.hide();
        fileSizeIntegerDecorator.hide();
        fileSizeEmptyDecorator.hide();
        pageSizeEmptyDecorator.hide();
        delimiterDuplicateDecorator.hide();
        delimiterSingleCharactorDecorator.hide();
        quoteSingleCharactorDecorator.hide();
        quoteCharactorDuplicateDecorator.hide();
        delimiterEmptyDecorator.hide();
        quoteCharactorEmptyDecorator.hide();
        fileSizeZeroDecorator.hide();
        pageSizeZeroDecorator.hide();

        delimiterTextBox.addVerifyListener(new VerifyListener() {
            @Override
            public void verifyText(VerifyEvent e) {
                validateForSingleAndDuplicateCharacter(e, quoteCharactorTextBox.getText(),
                        delimiterSingleCharactorDecorator, delimiterDuplicateDecorator, delimiterEmptyDecorator);

            }
        });

        quoteCharactorTextBox.addVerifyListener(new VerifyListener() {

            @Override
            public void verifyText(VerifyEvent e) {
                validateForSingleAndDuplicateCharacter(e, delimiterTextBox.getText(), quoteSingleCharactorDecorator,
                        quoteCharactorDuplicateDecorator, quoteCharactorEmptyDecorator);

            }

        });
        delimiterTextBox.addFocusListener(new FocusListener() {

            @Override
            public void focusLost(FocusEvent e) {
                validateDelimiterAndQuoteCharactorProperty(delimiterTextBox.getText(),
                        quoteCharactorTextBox.getText(), delimiterSingleCharactorDecorator,
                        delimiterDuplicateDecorator);
            }

            @Override
            public void focusGained(FocusEvent e) {

                enableAndDisableOkButtonIfAnyDecoratorIsVisible();

            }
        });

        quoteCharactorTextBox.addFocusListener(new FocusListener() {

            @Override
            public void focusLost(FocusEvent e) {
                validateDelimiterAndQuoteCharactorProperty(delimiterTextBox.getText(),
                        quoteCharactorTextBox.getText(), delimiterSingleCharactorDecorator,
                        delimiterDuplicateDecorator);
            }

            @Override
            public void focusGained(FocusEvent e) {

                enableAndDisableOkButtonIfAnyDecoratorIsVisible();

            }
        });
        attachListnersToSizeTextBox();
        return container;
    }

    private void setCursorTooltip(Control label, String helpText) {
        label.setToolTipText(helpText);
        label.setCursor(new Cursor(label.getDisplay(), SWT.CURSOR_HELP));
    }

    private void validateForSingleAndDuplicateCharacter(VerifyEvent e, String textBoxValue,
            ControlDecoration singleCharactorDecorator, ControlDecoration duplicateDecorator,
            ControlDecoration emptyDecorator) {
        singleCharactorDecorator.hide();
        duplicateDecorator.hide();
        emptyDecorator.hide();
        String value = ((Text) e.widget).getText();
        String currentValue = (value.substring(0, e.start) + e.text + value.substring(e.end));
        if (StringUtils.isNotEmpty(currentValue)) {
            validateDelimiterAndQuoteCharactorProperty(currentValue, textBoxValue, singleCharactorDecorator,
                    duplicateDecorator);
        } else {
            getButton(0).setEnabled(false);
            emptyDecorator.show();
            warningLabel.setText(Messages.WARNING_MESSAGE);
            warningLabel.setVisible(true);
            warningImageLabel.setVisible(true);
        }
    }

    private void attachListnersToSizeTextBox() {
        fileSizeTextBox.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                isTextBoxEmpty(e, fileSizeEmptyDecorator, fileSizeZeroDecorator);
            }
        });

        fileSizeTextBox.addVerifyListener(new VerifyListener() {
            @Override
            public void verifyText(VerifyEvent event) {
                validateTextBoxValue(event, fileSizeIntegerDecorator);
            }
        });

        fileSizeTextBox.addFocusListener(new FocusListener() {
            @Override
            public void focusLost(FocusEvent e) {
                fileSizeIntegerDecorator.hide();
                disableOkButtonWhenTextBoxIsEmpty(fileSizeTextBox);
            }

            @Override
            public void focusGained(FocusEvent e) {
                enableAndDisableOkButtonIfAnyDecoratorIsVisible();
            }
        });

        pageSizeTextBox.addFocusListener(new FocusListener() {
            @Override
            public void focusLost(FocusEvent e) {
                pageSizeIntegerDecorator.hide();
                disableOkButtonWhenTextBoxIsEmpty(pageSizeTextBox);
            }

            @Override
            public void focusGained(FocusEvent e) {
                enableAndDisableOkButtonIfAnyDecoratorIsVisible();
            }
        });

        pageSizeTextBox.addVerifyListener(new VerifyListener() {
            @Override
            public void verifyText(VerifyEvent event) {
                validateTextBoxValue(event, pageSizeIntegerDecorator);
            }
        });
        pageSizeTextBox.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                String pageSizeValue = ((Text) e.widget).getText();
                if (!pageSizeValue.isEmpty()) {
                    if (Integer.parseInt(pageSizeValue) > 5000) {
                        warningLabel.setText(Messages.MEMORY_OVERFLOW_EXCEPTION);
                        warningImageLabel.setVisible(true);
                        warningLabel.setVisible(true);
                    } else {
                        warningImageLabel.setVisible(false);
                        warningLabel.setVisible(false);
                    }
                }
                isTextBoxEmpty(e, pageSizeEmptyDecorator, pageSizeZeroDecorator);
            }
        });
    }

    private void disableOkButtonWhenTextBoxIsEmpty(Text textBox) {
        if (textBox.getText().isEmpty()) {
            getButton(0).setEnabled(false);
        } else {
            getButton(0).setEnabled(true);
        }
    }

    /**
     * Create contents of the button bar.
     * 
     * @param parent
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        parent.setLayout(new GridLayout(1, false));
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout(2, false));
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        warningImageLabel = new Label(composite, SWT.NONE);
        warningImageLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 1, 1));

        warningImageLabel.setImage(ImagePathConstant.WARNING_ICON.getImageFromRegistry());

        warningLabel = new Label(composite, SWT.NONE);
        warningLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, true, 1, 1));
        warningLabel.setText(Messages.WARNING_MESSAGE);

        warningLabel.setVisible(false);
        warningImageLabel.setVisible(false);
        if (!delimiterTextBox.getText().equalsIgnoreCase(",")
                || !quoteCharactorTextBox.getText().equalsIgnoreCase("\"")) {
            warningImageLabel.setVisible(true);
            warningLabel.setVisible(true);
        }
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * Return the initial size of the dialog.
     */
    @Override
    protected Point getInitialSize() {
        return new Point(731, 180);
    }

    @Override
    protected void okPressed() {
        viewDataPreferencesVO.setDelimiter(delimiterTextBox.getText());
        viewDataPreferencesVO.setQuoteCharactor(quoteCharactorTextBox.getText());
        viewDataPreferencesVO.setIncludeHeaders(includeHeardersCheckBox.getSelection());
        viewDataPreferencesVO.setFileSize(Integer.parseInt(fileSizeTextBox.getText()));
        viewDataPreferencesVO.setPageSize(Integer.parseInt(pageSizeTextBox.getText()));
        super.okPressed();
    }

    private boolean validateDelimiterAndQuoteCharactorProperty(String textBoxValue, String textBoxValue2,
            ControlDecoration singleCharactorDecorator, ControlDecoration duplicateDecorator) {
        if (StringUtils.length(ConvertHexValues.parseHex(textBoxValue)) == 1) {
            enableAndDisableOkButtonIfAnyDecoratorIsVisible();
            if (!(textBoxValue.equalsIgnoreCase(",") || textBoxValue.equalsIgnoreCase("\""))
                    && !textBoxValue.equalsIgnoreCase(textBoxValue2)) {
                warningLabel.setText(Messages.WARNING_MESSAGE);
                warningLabel.setVisible(true);
                warningImageLabel.setVisible(true);
                hideDelimiterAndQuoteCharactorDecorator();
                if (StringUtils.length(ConvertHexValues.parseHex(textBoxValue2)) > 1) {
                    getButton(0).setEnabled(false);
                } else {
                    getButton(0).setEnabled(true);
                    enableAndDisableOkButtonIfAnyDecoratorIsVisible();
                }
                return false;
            } else {
                if (textBoxValue.equalsIgnoreCase(textBoxValue2)) {
                    duplicateDecorator.show();
                    getButton(0).setEnabled(false);
                    return false;
                } else {
                    showWarningMessage(textBoxValue, textBoxValue2);
                    duplicateDecorator.hide();
                    enableAndDisableOkButtonIfAnyDecoratorIsVisible();
                    return true;
                }
            }
        } else {
            if (!textBoxValue.isEmpty()) {
                singleCharactorDecorator.show();
                getButton(0).setEnabled(false);
            }
            return false;
        }
    }

    private void showWarningMessage(String textBoxValue, String textBoxValue2) {
        if ((textBoxValue.equalsIgnoreCase(",") || textBoxValue.equalsIgnoreCase("\""))
                && (textBoxValue2.equalsIgnoreCase("\"") || textBoxValue2.equalsIgnoreCase(","))) {
            warningLabel.setVisible(false);
            warningImageLabel.setVisible(false);
        } else {
            warningLabel.setVisible(true);
            warningImageLabel.setVisible(true);
        }
    }

    private void hideDelimiterAndQuoteCharactorDecorator() {
        if (delimiterDuplicateDecorator.isVisible()) {
            delimiterDuplicateDecorator.hide();
        }
        if (quoteCharactorDuplicateDecorator.isVisible()) {
            quoteCharactorDuplicateDecorator.hide();
        }
    }

    private void enableAndDisableOkButtonIfAnyDecoratorIsVisible() {
        if (quoteCharactorDuplicateDecorator.isVisible() || quoteSingleCharactorDecorator.isVisible()
                || fileSizeEmptyDecorator.isVisible() || pageSizeEmptyDecorator.isVisible()
                || delimiterDuplicateDecorator.isVisible() || delimiterSingleCharactorDecorator.isVisible()
                || delimiterEmptyDecorator.isVisible() || quoteCharactorEmptyDecorator.isVisible()
                || fileSizeZeroDecorator.isVisible() || pageSizeZeroDecorator.isVisible()) {
            getButton(0).setEnabled(false);
        } else {
            getButton(0).setEnabled(true);
        }
    }

    public void setViewDataPreferences(ViewDataPreferencesVO viewDataPreferencesVO) {
        this.viewDataPreferencesVO = viewDataPreferencesVO;
    }

    public ViewDataPreferencesVO getViewDataPreferences() {
        return viewDataPreferencesVO;
    }

    private ControlDecoration addDecorator(Control control, String message) {
        ControlDecoration txtDecorator = new ControlDecoration(control, SWT.LEFT);
        FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault()
                .getFieldDecoration(FieldDecorationRegistry.DEC_ERROR);
        Image img = fieldDecoration.getImage();
        txtDecorator.setImage(img);
        txtDecorator.setDescriptionText(message);
        txtDecorator.setMarginWidth(3);
        return txtDecorator;
    }

    private void validateTextBoxValue(VerifyEvent event, ControlDecoration integerDecorator) {
        integerDecorator.hide();
        String string = event.text;
        Matcher matchs = Pattern.compile(REGEX).matcher(string);
        if (!matchs.matches()) {
            integerDecorator.show();
            event.doit = false;
        } else {
            integerDecorator.hide();
        }
    }

    private void isTextBoxEmpty(ModifyEvent e, ControlDecoration emptyDecorator, ControlDecoration zeroDecorator) {
        emptyDecorator.hide();
        zeroDecorator.hide();
        String fileSize = ((Text) e.widget).getText();
        if (!fileSize.isEmpty()) {
            emptyDecorator.hide();
            if (Integer.parseInt(fileSize) == 0) {
                zeroDecorator.show();
                getButton(0).setEnabled(false);
            } else {
                zeroDecorator.hide();
                getButton(0).setEnabled(true);
            }
            enableAndDisableOkButtonIfAnyDecoratorIsVisible();
        } else {
            getButton(0).setEnabled(false);
            emptyDecorator.show();
        }
    }

}