/******************************************************************************* * Copyright (c) 2000, 2017 IBM Corporation 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 org.eclipse.dltk.tcl.internal.ui.text.folding; import java.util.List; import org.eclipse.dltk.compiler.util.Util; import org.eclipse.dltk.tcl.ui.TclPreferenceConstants; import org.eclipse.dltk.ui.preferences.ControlBindingManager; import org.eclipse.dltk.ui.preferences.OverlayPreferenceStore; import org.eclipse.dltk.ui.preferences.OverlayPreferenceStore.OverlayKey; import org.eclipse.dltk.ui.text.folding.SourceCodeFoldingPreferenceBlock; import org.eclipse.dltk.ui.util.PixelConverter; import org.eclipse.dltk.ui.util.SWTFactory; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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; /** * Tcl source code folding preferences. */ public class TclFoldingPreferenceBlock extends SourceCodeFoldingPreferenceBlock { private Button fFoldOtherEnabled; private Button fInitFoldOtherBlocks; private ListBlock fExcludePatterns; private ListBlock fIncludePatterns; public TclFoldingPreferenceBlock(OverlayPreferenceStore store, PreferencePage page) { super(store, page); } @Override public Control createControl(Composite parent) { Control control = super.createControl(parent); createDependency(fFoldOtherEnabled, new Control[] { fInitFoldOtherBlocks }, ControlBindingManager.DEPENDENCY_INVERSE_SELECTION); return control; } @Override protected void addInitiallyFoldOptions(Group group) { super.addInitiallyFoldOptions(group); fInitFoldOtherBlocks = createCheckBox(group, TclFoldingMessages.DefaultFoldingPreferenceBlock_other, TclPreferenceConstants.EDITOR_FOLDING_INIT_OTHER); } @Override protected void addOverlayKeys(List<OverlayKey> keys) { super.addOverlayKeys(keys); keys.add(new OverlayPreferenceStore.OverlayKey( OverlayPreferenceStore.INT, TclPreferenceConstants.EDITOR_FOLDING_BLOCKS)); keys.add(new OverlayPreferenceStore.OverlayKey( OverlayPreferenceStore.STRING, TclPreferenceConstants.EDITOR_FOLDING_INCLUDE_LIST)); keys.add(new OverlayPreferenceStore.OverlayKey( OverlayPreferenceStore.STRING, TclPreferenceConstants.EDITOR_FOLDING_EXCLUDE_LIST)); keys.add(new OverlayPreferenceStore.OverlayKey( OverlayPreferenceStore.BOOLEAN, TclPreferenceConstants.EDITOR_FOLDING_INIT_OTHER)); } @Override protected void createOptionsControl(Composite composite) { Group group = SWTFactory.createGroup(composite, TclFoldingMessages.TclFoldingPreferenceBlock_10, 1, 1, GridData.FILL_HORIZONTAL); fFoldOtherEnabled = createRadioButton(group, TclFoldingMessages.TclFoldingPreferenceBlock_11, TclPreferenceConstants.EDITOR_FOLDING_BLOCKS, new Integer(TclPreferenceConstants.EDITOR_FOLDING_BLOCKS_OFF)); createRadioButton(group, TclFoldingMessages.TclFoldingPreferenceBlock_12, TclPreferenceConstants.EDITOR_FOLDING_BLOCKS, new Integer( TclPreferenceConstants.EDITOR_FOLDING_BLOCKS_EXCLUDE)); fExcludePatterns = new ListBlock(group, TclPreferenceConstants.EDITOR_FOLDING_EXCLUDE_LIST); createRadioButton(group, TclFoldingMessages.TclFoldingPreferenceBlock_13, TclPreferenceConstants.EDITOR_FOLDING_BLOCKS, new Integer( TclPreferenceConstants.EDITOR_FOLDING_BLOCKS_INCLUDE)); fIncludePatterns = new ListBlock(group, TclPreferenceConstants.EDITOR_FOLDING_INCLUDE_LIST); } @Override protected String getInitiallyFoldClassesKey() { return TclPreferenceConstants.EDITOR_FOLDING_INIT_NAMESPACES; } @Override protected String getInitiallyFoldMethodsKey() { return TclPreferenceConstants.EDITOR_FOLDING_INIT_BLOCKS; } @Override protected String getInitiallyFoldClassesText() { return TclFoldingMessages.DefaultFoldingPreferenceBlock_innerTypes; } @Override protected String getInitiallyFoldMethodsText() { return TclFoldingMessages.DefaultFoldingPreferenceBlock_methods; } protected class ListBlock { private ListViewer fList; private String fKey; private Button fAddButton; private Button fRemoveButton; public ListBlock(Composite parent, String key) { fKey = key; createControl(parent); } private Control createControl(Composite parent) { Font font = parent.getFont(); Composite comp = new Composite(parent, SWT.NONE); GridLayout topLayout = new GridLayout(); topLayout.numColumns = 2; topLayout.marginHeight = 0; topLayout.marginWidth = 0; comp.setLayout(topLayout); GridData gd = new GridData(GridData.FILL_BOTH); comp.setLayoutData(gd); fList = new ListViewer(comp); gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 6; fList.getControl().setLayoutData(gd); Composite pathButtonComp = new Composite(comp, SWT.NONE); GridLayout pathButtonLayout = new GridLayout(); pathButtonLayout.marginHeight = 0; pathButtonLayout.marginWidth = 0; pathButtonComp.setLayout(pathButtonLayout); gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL); pathButtonComp.setLayoutData(gd); pathButtonComp.setFont(font); fAddButton = createPushButton(pathButtonComp, TclFoldingMessages.TclFoldingPreferenceBlock_0); fAddButton.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { } @Override public void widgetSelected(SelectionEvent e) { IInputValidator validator = newText -> { if (newText.trim().length() > 0 && newText.matches("[_a-zA-Z]*")) //$NON-NLS-1$ return null; return TclFoldingMessages.TclFoldingPreferenceBlock_2; }; InputDialog dlg = new InputDialog(null, TclFoldingMessages.TclFoldingPreferenceBlock_3, TclFoldingMessages.TclFoldingPreferenceBlock_4, Util.EMPTY_STRING, validator); if (dlg.open() == Window.OK) { fList.add(dlg.getValue()); save(); } } }); fRemoveButton = createPushButton(pathButtonComp, TclFoldingMessages.TclFoldingPreferenceBlock_6); fRemoveButton.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { } @Override public void widgetSelected(SelectionEvent e) { ISelection s = fList.getSelection(); if (s instanceof IStructuredSelection) { IStructuredSelection sel = (IStructuredSelection) s; fList.remove(sel.toArray()); save(); } } }); return comp; } protected Button createPushButton(Composite parent, String label) { Button button = new Button(parent, SWT.PUSH); button.setFont(parent.getFont()); if (label != null) { button.setText(label); } GridData gd = new GridData(); button.setLayoutData(gd); gd.widthHint = getButtonWidthHint(button); gd.horizontalAlignment = GridData.FILL; return button; } /** * Returns a width hint for a button control. */ public int getButtonWidthHint(Button button) { button.setFont(JFaceResources.getDialogFont()); PixelConverter converter = new PixelConverter(button); int widthHint = converter.convertHorizontalDLUsToPixels( IDialogConstants.BUTTON_WIDTH); return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); } private String[] getEntries() { return fList.getList().getItems(); } private void setEntries(String items[]) { fList.remove(fList.getList().getItems()); for (int i = 0; i < items.length; i++) { if (items[i].trim().length() > 0) fList.add(items[i]); } } public void save() { String items[] = getEntries(); StringBuffer buf = new StringBuffer(); for (int i = 0; i < items.length; i++) { buf.append(items[i]); if (i != items.length - 1) buf.append(","); //$NON-NLS-1$ } getPreferenceStore().setValue(fKey, buf.toString()); } public void initialize() { String val = getPreferenceStore().getString(fKey); if (val != null) { String items[] = val.split(","); //$NON-NLS-1$ setEntries(items); } } public void performDefault() { String val = getPreferenceStore().getDefaultString(fKey); if (val != null) { String items[] = val.split(","); //$NON-NLS-1$ setEntries(items); } } } @Override public void initialize() { super.initialize(); fExcludePatterns.initialize(); fIncludePatterns.initialize(); } @Override public void performDefaults() { super.performDefaults(); fExcludePatterns.performDefault(); fIncludePatterns.performDefault(); } }