package com.redhat.ceylon.eclipse.code.style; import static com.redhat.ceylon.eclipse.code.style.CeylonFormatterConstants.*; import java.util.Observable; import java.util.Observer; import org.eclipse.core.runtime.Assert; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; public class FormatterTabIndent extends FormatterTabPage { private final String PREVIEW = "shared class AccessCountingIterable<Element,Absent>(Iterable<Element,Absent> wrapped)\n" + " extends Object()\n" + " satisfies Iterable<Element,Absent>\n" + " given Absent satisfies Null {\n" + " \n" + " variable Integer accessCounter = 0;\n" + " shared Integer accessCount => accessCounter;\n" + " \n" + " shared actual Iterator<Element> iterator() {\n" + " accessCounter++;\n" + " return wrapped.iterator();\n" + " }\n" + " \n" + " shared actual Boolean equals(Object that) {\n" + " if (is Iterable<Element,Absent> that) {\n" + " return wrapped == that;\n" + " } else {\n" + " return false;\n" + " }\n" + " }\n" + " \n" + " shared actual Integer hash =>\n" + " sum {\n" + " accessCounter.hash,\n" + " wrapped.hash\n" + " };\n" + "}\n"; private CeylonPreview ceylonPreview; public FormatterTabIndent(FormatterModifyProfileDialog modifyDialog, FormatterPreferences workingValues) { super(modifyDialog, workingValues); } @Override protected void doCreatePreferences(Composite composite, int numColumns) { final Group generalGroup = createGroup(numColumns, composite, "Indent Mode"); final String[] indentModeValues = new String[] { FORMATTER_indentMode_Spaces.toLowerCase(), FORMATTER_indentMode_Tabs.toLowerCase(), FORMATTER_indentMode_Mixed.toLowerCase() }; final String[] indentModeLabels = new String[] { FORMATTER_indentMode_Spaces, FORMATTER_indentMode_Tabs, FORMATTER_indentMode_Mixed }; final ComboPreference indentMode = createComboPref(generalGroup, numColumns, "Indent mode", FORMATTER_indentMode, indentModeValues, indentModeLabels); indentMode.setEnabled(!ideMode); final NumberPreference indentSpacesSize = createNumberPref( generalGroup, numColumns, "Indent mode spaces", FORMATTER_indentMode_Spaces_Size, 0, 32); indentSpacesSize.setEnabled(!ideMode); final NumberPreference indentTabsSize = createNumberPref(generalGroup, numColumns, "Indent mode tab width", FORMATTER_indentMode_Tabs_Size, 0, 32); indentTabsSize.setEnabled(!ideMode); if (!ideMode) { updateTabPreferences(this.workingValues.get(FORMATTER_indentMode), indentSpacesSize, indentTabsSize); } else { Label warning = createLabel(numColumns, generalGroup, "IDE editor options override this profile setting"); warning.setForeground(composite.getDisplay().getSystemColor(SWT.COLOR_RED)); } indentMode.addObserver(new Observer() { public void update(Observable o, Object arg) { updateTabPreferences((String) arg, indentSpacesSize, indentTabsSize); } }); // group ended final Group otherGroup = createGroup(numColumns, composite, "Other Indent Options"); createCheckboxPref(otherGroup, numColumns, "Indent blank lines", FORMATTER_indent_Blank_Lines, FALSE_TRUE); createNumberPref(otherGroup, 3, "Indent before type info", FORMATTER_indent_Before_Type_Info, 0, 32); } @Override public void initializePage() { ceylonPreview.setPreviewText(PREVIEW); } @Override protected CeylonPreview doCreateCeylonPreview(Composite parent) { ceylonPreview = new CeylonPreview(this.workingValues, parent); return ceylonPreview; } @Override protected void doUpdatePreview() { super.doUpdatePreview(); ceylonPreview.setPreviewText(PREVIEW); ceylonPreview.update(); } private void updateTabPreferences(String tabPolicy, NumberPreference indentSpacesSize, NumberPreference indentTabsSize) { if (FORMATTER_indentMode_Spaces.equalsIgnoreCase(tabPolicy)) { indentSpacesSize.setEnabled(true); indentTabsSize.setEnabled(false); } else if (FORMATTER_indentMode_Tabs.equalsIgnoreCase(tabPolicy)) { indentSpacesSize.setEnabled(false); indentTabsSize.setEnabled(true); } else if (FORMATTER_indentMode_Mixed.equalsIgnoreCase(tabPolicy)) { indentSpacesSize.setEnabled(true); indentTabsSize.setEnabled(true); } else { Assert.isTrue(false); } } }