com.cisco.yangide.editor.preferences.YangFormatterPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for com.cisco.yangide.editor.preferences.YangFormatterPreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others.  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
 *  
 *******************************************************************************/
package com.cisco.yangide.editor.preferences;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextUtilities;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.swt.SWT;
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.graphics.Font;
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.Group;
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.editors.text.EditorsUI;
import org.eclipse.ui.texteditor.ChainedPreferenceStore;

import com.cisco.yangide.core.parser.YangFormattingPreferences;
import com.cisco.yangide.core.parser.YangParserUtil;
import com.cisco.yangide.editor.YangEditorPlugin;
import com.cisco.yangide.editor.editors.YangColorManager;
import com.cisco.yangide.editor.editors.YangSourceViewerConfiguration;
import com.cisco.yangide.ui.YangUIPlugin;
import com.cisco.yangide.ui.preferences.YangPreferenceConstants;

/**
 * @author Konstantin Zaitsev
 * @date Jul 22, 2014
 */
public class YangFormatterPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    private SourceViewer previewViewer;
    private YangColorManager colorManager;
    private Button useTabs;
    private Text tabSizeTxt;
    private Text lineWidthTxt;
    private Button formatString;
    private Button formatComments;
    private Button collapseImport;
    private String content;

    public YangFormatterPreferencePage() {
        colorManager = new YangColorManager(false);
    }

    @Override
    public void init(IWorkbench workbench) {
        this.setPreferenceStore(YangUIPlugin.getDefault().getPreferenceStore());
    }

    @Override
    public void dispose() {
        super.dispose();
        colorManager.dispose();
    }

    @Override
    protected Control createContents(Composite parent) {
        initializeDialogUnits(parent);
        Composite content = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        content.setLayout(layout);

        Group indentationGroup = createGroup(2, content, "Indentation");

        new Label(indentationGroup, SWT.NONE).setText("Tab size:");
        tabSizeTxt = new Text(indentationGroup, SWT.BORDER);

        useTabs = new Button(indentationGroup, SWT.CHECK);
        useTabs.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
        useTabs.setText("Use tab character instead of space");

        Group wrappingGroup = createGroup(2, content, "Line Wrapping");

        new Label(wrappingGroup, SWT.NONE).setText("Maximum line width (characters):");
        lineWidthTxt = new Text(wrappingGroup, SWT.BORDER);

        formatString = new Button(wrappingGroup, SWT.CHECK);
        formatString.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
        formatString.setText("Wrap long strings (description, references, etc)");

        formatComments = new Button(wrappingGroup, SWT.CHECK);
        formatComments.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
        formatComments.setText("Wrap long block comments");

        collapseImport = new Button(wrappingGroup, SWT.CHECK);
        collapseImport.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
        collapseImport.setText("Collapse import statement in single line");

        Label previewLabel = new Label(content, SWT.LEFT);
        previewLabel.setText("Preview:");
        previewLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Control previewer = createPreviewer(content);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = convertWidthInCharsToPixels(20);
        gd.heightHint = convertHeightInCharsToPixels(5);
        previewer.setLayoutData(gd);

        initializeFields();

        applyDialogFont(content);
        updatePreview();
        return content;
    }

    private void initializeFields() {
        tabSizeTxt.setText(String.valueOf(getPreferenceStore().getInt(YangPreferenceConstants.FMT_INDENT_WIDTH)));
        useTabs.setSelection(!getPreferenceStore().getBoolean(YangPreferenceConstants.FMT_INDENT_SPACE));
        lineWidthTxt
                .setText(String.valueOf(getPreferenceStore().getInt(YangPreferenceConstants.FMT_MAX_LINE_LENGTH)));
        formatComments.setSelection(getPreferenceStore().getBoolean(YangPreferenceConstants.FMT_COMMENT));
        formatString.setSelection(getPreferenceStore().getBoolean(YangPreferenceConstants.FMT_STRING));
        collapseImport.setSelection(getPreferenceStore().getBoolean(YangPreferenceConstants.FMT_COMPACT_IMPORT));

        tabSizeTxt.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                updatePreview();
            }
        });
        useTabs.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                updatePreview();
            }
        });
        lineWidthTxt.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                updatePreview();
            }
        });
        formatComments.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                updatePreview();
            }
        });
        formatString.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                updatePreview();
            }
        });
        collapseImport.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                updatePreview();
            }
        });
    }

    @Override
    public boolean performOk() {
        IPreferenceStore store = getPreferenceStore();
        store.setValue(YangPreferenceConstants.FMT_INDENT_SPACE, !useTabs.getSelection());
        store.setValue(YangPreferenceConstants.FMT_INDENT_WIDTH, Integer.parseInt(tabSizeTxt.getText()));
        store.setValue(YangPreferenceConstants.FMT_MAX_LINE_LENGTH, Integer.parseInt(lineWidthTxt.getText()));
        store.setValue(YangPreferenceConstants.FMT_COMMENT, formatComments.getSelection());
        store.setValue(YangPreferenceConstants.FMT_STRING, formatString.getSelection());
        store.setValue(YangPreferenceConstants.FMT_COMPACT_IMPORT, collapseImport.getSelection());
        return true;
    }

    @Override
    protected void performDefaults() {
        IPreferenceStore store = getPreferenceStore();
        tabSizeTxt.setText(String.valueOf(store.getDefaultInt(YangPreferenceConstants.FMT_INDENT_WIDTH)));
        useTabs.setSelection(!store.getDefaultBoolean(YangPreferenceConstants.FMT_INDENT_SPACE));
        lineWidthTxt.setText(String.valueOf(store.getDefaultInt(YangPreferenceConstants.FMT_MAX_LINE_LENGTH)));
        formatComments.setSelection(store.getDefaultBoolean(YangPreferenceConstants.FMT_COMMENT));
        formatString.setSelection(store.getDefaultBoolean(YangPreferenceConstants.FMT_STRING));
        collapseImport.setSelection(store.getDefaultBoolean(YangPreferenceConstants.FMT_COMPACT_IMPORT));
        super.performDefaults();
    }

    private void updatePreview() {
        YangFormattingPreferences preferences = new YangFormattingPreferences();
        preferences.setSpaceForTabs(!useTabs.getSelection());
        preferences.setIndentSize(Integer.parseInt(tabSizeTxt.getText()));
        preferences.setMaxLineLength(Integer.parseInt(lineWidthTxt.getText()));
        preferences.setCompactImport(collapseImport.getSelection());
        preferences.setFormatComment(formatComments.getSelection());
        preferences.setFormatStrings(formatString.getSelection());

        String str = YangParserUtil.formatYangSource(preferences, content.toCharArray(), 0,
                TextUtilities.getDefaultLineDelimiter(previewViewer.getDocument()));
        previewViewer.getDocument().set(str);
    }

    private Group createGroup(int numColumns, Composite parent, String text) {
        final Group group = new Group(parent, SWT.NONE);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = numColumns;
        gd.widthHint = 0;
        group.setLayoutData(gd);
        group.setFont(parent.getFont());

        final GridLayout layout = new GridLayout(numColumns, false);
        group.setLayout(layout);
        group.setText(text);
        return group;
    }

    private Control createPreviewer(Composite parent) {
        previewViewer = new SourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);

        YangSourceViewerConfiguration configuration = new YangSourceViewerConfiguration(
                YangEditorPlugin.getDefault().getCombinedPreferenceStore(), colorManager, null);

        previewViewer.configure(configuration);
        previewViewer.setEditable(false);
        Font font = JFaceResources.getFont(JFaceResources.TEXT_FONT);
        previewViewer.getTextWidget().setFont(font);

        IPreferenceStore store = new ChainedPreferenceStore(
                new IPreferenceStore[] { getPreferenceStore(), EditorsUI.getPreferenceStore() });

        new YangPreviewerUpdater(previewViewer, configuration, store);

        content = YangEditorPlugin.getDefault().getBundleFileContent("/resources/FormatterSettingPreviewCode.txt");
        IDocument document = new Document(content);
        new YangDocumentSetupParticipant().setup(document);
        previewViewer.setDocument(document);

        return previewViewer.getControl();
    }
}