/******************************************************************************* * 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(); } }