diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.java index 2c44e7355..a12f4daab 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.java @@ -25,22 +25,22 @@ public final class LanguageConfigurationMessages extends NLS { public static String AutoClosingPairConditionalTableWidget_notIn; public static String CharacterPairsTableWidget_end; public static String CharacterPairsTableWidget_start; - public static String LanguageConfigurationInfoWidget_autoClosingPairs; + public static String LanguageConfigurationInfoWidget_autoClosingPairs_title; public static String LanguageConfigurationInfoWidget_autoCloseBefore_message; public static String LanguageConfigurationInfoWidget_autoCloseBefore_title; public static String LanguageConfigurationInfoWidget_blockCommentsEnd; public static String LanguageConfigurationInfoWidget_blockCommentsStart; - public static String LanguageConfigurationInfoWidget_brackets; - public static String LanguageConfigurationInfoWidget_comments; + public static String LanguageConfigurationInfoWidget_brackets_title; + public static String LanguageConfigurationInfoWidget_comments_title; public static String LanguageConfigurationInfoWidget_end; public static String LanguageConfigurationInfoWidget_folding_title; public static String LanguageConfigurationInfoWidget_lineComments; public static String LanguageConfigurationInfoWidget_markers; public static String LanguageConfigurationInfoWidget_offSide; public static String LanguageConfigurationInfoWidget_offSide_tooltip; - public static String LanguageConfigurationInfoWidget_onEnterRules; + public static String LanguageConfigurationInfoWidget_onEnterRules_title; public static String LanguageConfigurationInfoWidget_start; - public static String LanguageConfigurationInfoWidget_surroundingPairs; + public static String LanguageConfigurationInfoWidget_surroundingPairs_title; public static String LanguageConfigurationInfoWidget_wordPattern_message; public static String LanguageConfigurationInfoWidget_wordPattern_title; public static String LanguageConfigurationPreferencePage_contentTypeName; diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.properties b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.properties index 34fe7f2dc..5570326f1 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.properties +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.properties @@ -12,22 +12,22 @@ AutoClosingPairConditionalTableWidget_notIn=Not In CharacterPairsTableWidget_start=Start CharacterPairsTableWidget_end=End -LanguageConfigurationInfoWidget_autoClosingPairs=Auto Closing Pairs +LanguageConfigurationInfoWidget_autoClosingPairs_title=Auto Closing Pairs LanguageConfigurationInfoWidget_autoCloseBefore_message=Auto Close Before: LanguageConfigurationInfoWidget_autoCloseBefore_title=Auto Close Before LanguageConfigurationInfoWidget_blockCommentsEnd=Block Comment End: LanguageConfigurationInfoWidget_blockCommentsStart=Block Comment Start: -LanguageConfigurationInfoWidget_brackets=Brackets -LanguageConfigurationInfoWidget_comments=Comments +LanguageConfigurationInfoWidget_brackets_title=Brackets +LanguageConfigurationInfoWidget_comments_title=Comments LanguageConfigurationInfoWidget_end=End: LanguageConfigurationInfoWidget_folding_title=Folding LanguageConfigurationInfoWidget_lineComments=Line Comment: LanguageConfigurationInfoWidget_markers=markers LanguageConfigurationInfoWidget_offSide=Off Side: LanguageConfigurationInfoWidget_offSide_tooltip=Empty lines trailing a code section belong to the next folding section -LanguageConfigurationInfoWidget_onEnterRules=On Enter Rules +LanguageConfigurationInfoWidget_onEnterRules_title=On Enter Rules LanguageConfigurationInfoWidget_start=Start: -LanguageConfigurationInfoWidget_surroundingPairs=Surrounding Pairs +LanguageConfigurationInfoWidget_surroundingPairs_title=Surrounding Pairs LanguageConfigurationInfoWidget_wordPattern_message=Word Pattern: LanguageConfigurationInfoWidget_wordPattern_title=Word Pattern LanguageConfigurationPreferencePage_contentTypeName=Content Type @@ -44,7 +44,7 @@ LanguageConfigurationPreferencesWidget_enableOnEnterActions=Enable on enter acti LanguageConfigurationPreferencesWidget_enableMatchingBrackets=Enable matching brackets OnEnterRuleTableWidget_beforeText=Before Text OnEnterRuleTableWidget_afterText=After Text -OnEnterRuleTableWidget_previousLineText=Prev. Line Text +OnEnterRuleTableWidget_previousLineText=Previous Line Text OnEnterRuleTableWidget_indentAction=Indent Action OnEnterRuleTableWidget_appendText=Append Text OnEnterRuleTableWidget_removeText=Remove Text diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/AbstractTableWidget.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/AbstractTableWidget.java new file mode 100644 index 000000000..8bc00d8c6 --- /dev/null +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/AbstractTableWidget.java @@ -0,0 +1,115 @@ +/** + * Copyright (c) 2024 Vegard IT GmbH and others. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * - Sebastian Thomschke - initial implementation + */ +package org.eclipse.tm4e.languageconfiguration.internal.widgets; + +import java.util.Collections; +import java.util.List; + +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jface.layout.TableColumnLayout; +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.jface.viewers.ColumnWeightData; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.TableColumn; + +abstract class AbstractTableWidget extends TableViewer { + + private final class CellLabelProvider extends LabelProvider implements ITableLabelProvider { + @Override + public @Nullable Image getColumnImage(final @Nullable Object element, final int columnIndex) { + return null; + } + + @Override + public String getText(final @Nullable Object element) { + return getColumnText(element, 0); + } + + @Override + @SuppressWarnings("unchecked") + public String getColumnText(@Nullable final Object element, final int columnIndex) { + return element == null ? "" : AbstractTableWidget.this.getColumnText((T) element, columnIndex); + } + } + + private static final class RowContentProvider implements IStructuredContentProvider { + private List items = Collections.emptyList(); + + @Override + public void dispose() { + items = Collections.emptyList(); + } + + @Override + public Object[] getElements(final @Nullable Object input) { + return items.toArray(Object[]::new); + } + + @Override + @SuppressWarnings("unchecked") + public void inputChanged(final @Nullable Viewer viewer, final @Nullable Object oldInput, final @Nullable Object newInput) { + items = newInput == null ? Collections.emptyList() : (List) newInput; + } + } + + private final TableColumnLayout tableColumnLayout = new TableColumnLayout(); + + protected AbstractTableWidget(Composite parent) { + this(parent, SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); + } + + protected AbstractTableWidget(Composite parent, int style) { + super(new Composite(parent, SWT.NONE), style); + + setContentProvider(new RowContentProvider<>()); + setLabelProvider(new CellLabelProvider()); + + var table = getTable(); + var container = table.getParent(); + container.setLayout(new TableColumnLayout()); + if (parent.getLayout() instanceof GridLayout) { + container.setLayoutData(new GridData(GridData.FILL_BOTH)); + } + table.setHeaderVisible(true); + table.setLinesVisible(true); + + createColumns(); + } + + protected abstract void createColumns(); + + protected void createColumn(String label, int columnWeight, int minColWidth, boolean resizable) { + final var col = new TableColumn(getTable(), SWT.NONE); + col.setText(label); + final GC gc = new GC(getTable().getShell()); + try { + gc.setFont(JFaceResources.getDialogFont()); + final int labelWidth = gc.stringExtent(label).x + 15; + tableColumnLayout.setColumnData(col, new ColumnWeightData(columnWeight, Math.max(labelWidth, minColWidth), resizable)); + } finally { + gc.dispose(); + } + } + + protected abstract String getColumnText(final T element, final int columnIndex); +} diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/AutoClosingPairConditionalTableWidget.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/AutoClosingPairConditionalTableWidget.java index 9d1d54abb..542db033e 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/AutoClosingPairConditionalTableWidget.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/AutoClosingPairConditionalTableWidget.java @@ -8,52 +8,33 @@ * * Contributors: * Lucas Bullen (Red Hat Inc.) - initial API and implementation + * Sebastian Thomschke - refactored to extend AbstractTableWidget */ package org.eclipse.tm4e.languageconfiguration.internal.widgets; -import static org.eclipse.tm4e.languageconfiguration.internal.LanguageConfigurationMessages.*; +import static org.eclipse.tm4e.languageconfiguration.internal.LanguageConfigurationMessages.AutoClosingPairConditionalTableWidget_notIn; -import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.jface.layout.TableColumnLayout; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.viewers.ColumnWeightData; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Composite; import org.eclipse.tm4e.languageconfiguration.internal.model.AutoClosingPairConditional; +import org.eclipse.tm4e.languageconfiguration.internal.model.CharacterPair; final class AutoClosingPairConditionalTableWidget extends CharacterPairsTableWidget { - AutoClosingPairConditionalTableWidget(final Table table) { - super(table); - setLabelProvider(new AutoClosingPairConditionalLabelProvider()); - - final GC gc = new GC(table.getShell()); - gc.setFont(JFaceResources.getDialogFont()); - final var columnLayout = new TableColumnLayout(); - - final var column2 = new TableColumn(table, SWT.NONE); - column2.setText(AutoClosingPairConditionalTableWidget_notIn); - final int minWidth = computeMinimumColumnWidth(gc, AutoClosingPairConditionalTableWidget_notIn); - columnLayout.setColumnData(column2, new ColumnWeightData(2, minWidth, true)); - - gc.dispose(); + AutoClosingPairConditionalTableWidget(final Composite parent) { + super(parent); } - private static final class AutoClosingPairConditionalLabelProvider extends CharacterPairLabelProvider { + @Override + protected void createColumns() { + super.createColumns(); + createColumn(AutoClosingPairConditionalTableWidget_notIn, 2, 0, true); + } - @Nullable - @Override - public String getColumnText(@Nullable final Object element, final int columnIndex) { - if (columnIndex == 2) { - if (element instanceof final AutoClosingPairConditional conditionalPair) { - return String.join(", ", conditionalPair.notIn); //$NON-NLS-1$ - } - return ""; //$NON-NLS-1$ - } - return super.getColumnText(element, columnIndex); + @Override + protected String getColumnText(CharacterPair charPair, int columnIndex) { + if (columnIndex == 2 && charPair instanceof final AutoClosingPairConditional conditionalPair) { + return String.join(", ", conditionalPair.notIn); } + return super.getColumnText(charPair, columnIndex); } - } diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/CharacterPairsTableWidget.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/CharacterPairsTableWidget.java index d910273ae..020ba00a2 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/CharacterPairsTableWidget.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/CharacterPairsTableWidget.java @@ -8,110 +8,33 @@ * * Contributors: * Lucas Bullen (Red Hat Inc.) - initial API and implementation + * Sebastian Thomschke - refactored to extend AbstractTableWidget */ package org.eclipse.tm4e.languageconfiguration.internal.widgets; import static org.eclipse.tm4e.languageconfiguration.internal.LanguageConfigurationMessages.*; -import java.util.Collections; -import java.util.List; - -import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.jface.layout.TableColumnLayout; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.viewers.ColumnWeightData; -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Composite; import org.eclipse.tm4e.languageconfiguration.internal.model.CharacterPair; -class CharacterPairsTableWidget extends TableViewer { - - CharacterPairsTableWidget(final Table table) { - super(table); - setContentProvider(new CharacterPairContentProvider()); - setLabelProvider(new CharacterPairLabelProvider()); - - final GC gc = new GC(table.getShell()); - gc.setFont(JFaceResources.getDialogFont()); - final var columnLayout = new TableColumnLayout(); - - final var column1 = new TableColumn(table, SWT.NONE); - column1.setText(CharacterPairsTableWidget_start); - int minWidth = computeMinimumColumnWidth(gc, CharacterPairsTableWidget_start); - columnLayout.setColumnData(column1, new ColumnWeightData(2, minWidth, true)); +class CharacterPairsTableWidget extends AbstractTableWidget { - final var column2 = new TableColumn(table, SWT.NONE); - column2.setText(CharacterPairsTableWidget_end); - minWidth = computeMinimumColumnWidth(gc, CharacterPairsTableWidget_end); - columnLayout.setColumnData(column2, new ColumnWeightData(2, minWidth, true)); - - gc.dispose(); - } - - protected int computeMinimumColumnWidth(final GC gc, final String string) { - return gc.stringExtent(string).x + 10; + CharacterPairsTableWidget(final Composite parent) { + super(parent); } - private static final class CharacterPairContentProvider implements IStructuredContentProvider { - - private List characterPairList = Collections.emptyList(); - - @Override - public Object[] getElements(@Nullable final Object input) { - return characterPairList.toArray(CharacterPair[]::new); - } - - @SuppressWarnings("unchecked") - @Override - public void inputChanged(@Nullable final Viewer viewer, @Nullable final Object oldInput, - @Nullable final Object newInput) { - if (newInput == null) { - characterPairList = Collections.emptyList(); - } else { - characterPairList = (List) newInput; - } - } - - @Override - public void dispose() { - characterPairList = Collections.emptyList(); - } + @Override + protected String getColumnText(CharacterPair charPair, int columnIndex) { + return switch (columnIndex) { + case 0 -> charPair.open; + case 1 -> charPair.close; + default -> ""; + }; } - protected static class CharacterPairLabelProvider extends LabelProvider implements ITableLabelProvider { - - @Nullable - @Override - public Image getColumnImage(@Nullable final Object element, final int columnIndex) { - return null; - } - - @Nullable - @Override - public String getText(@Nullable final Object element) { - return getColumnText(element, 0); - } - - @Nullable - @Override - public String getColumnText(@Nullable final Object element, final int columnIndex) { - if (element == null) - return null; - - return switch (columnIndex) { - case 0 -> ((CharacterPair) element).open; - case 1 -> ((CharacterPair) element).close; - default -> ""; //$NON-NLS-1$ - }; - } + @Override + protected void createColumns() { + createColumn(CharacterPairsTableWidget_start, 1, 0, true); + createColumn(CharacterPairsTableWidget_end, 1, 0, true); } - } diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java index db353bbbe..10a931dad 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java @@ -13,12 +13,11 @@ import static org.eclipse.tm4e.languageconfiguration.internal.LanguageConfigurationMessages.*; -import java.util.List; import java.util.Objects; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.jface.layout.TableColumnLayout; +import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -26,7 +25,6 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; -import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.eclipse.tm4e.languageconfiguration.internal.model.CharacterPair; import org.eclipse.tm4e.languageconfiguration.internal.model.CommentRule; @@ -54,9 +52,9 @@ public class LanguageConfigurationInfoWidget extends Composite { private CharacterPairsTableWidget surroundingPairsTable; private TabItem foldingTab; - private Text offsideText; - private Text markersStartText; - private Text markersEndText; + private Text foldingOffsideText; + private Text foldingMarkersStartText; + private Text foldingMarkersEndText; private TabItem wordPatternTab; private Text wordPatternText; @@ -66,12 +64,7 @@ public class LanguageConfigurationInfoWidget extends Composite { public LanguageConfigurationInfoWidget(final Composite parent, final int style) { super(parent, style); - final var layout = new GridLayout(); - layout.marginHeight = 0; - layout.marginWidth = 0; - layout.marginLeft = 0; - layout.marginRight = 0; - super.setLayout(layout); + super.setLayout(GridLayoutFactory.fillDefaults().create()); super.setLayoutData(new GridData(GridData.FILL_BOTH)); createUI(this); } @@ -93,26 +86,25 @@ private void createUI(final Composite ancestor) { } public void refresh(@Nullable final LanguageConfiguration configuration) { - lineCommentText.setText(""); //$NON-NLS-1$ - blockCommentStartText.setText(""); //$NON-NLS-1$ - blockCommentEndText.setText(""); //$NON-NLS-1$ + lineCommentText.setText(""); + blockCommentStartText.setText(""); + blockCommentEndText.setText(""); bracketsTable.setInput(null); autoClosingPairsTable.setInput(null); - autoCloseBeforeText.setText(""); //$NON-NLS-1$ + autoCloseBeforeText.setText(""); surroundingPairsTable.setInput(null); - offsideText.setText(""); //$NON-NLS-1$ - markersStartText.setText(""); //$NON-NLS-1$ - markersEndText.setText(""); //$NON-NLS-1$ - wordPatternText.setText(""); //$NON-NLS-1$ + foldingOffsideText.setText(""); + foldingMarkersStartText.setText(""); + foldingMarkersEndText.setText(""); + wordPatternText.setText(""); onEnterRuleTable.setInput(null); - if (configuration == null) { + if (configuration == null) return; - } final CommentRule comments = configuration.getComments(); if (comments != null) { - lineCommentText.setText(comments.lineComment == null ? "" : comments.lineComment); + lineCommentText.setText(Objects.toString(comments.lineComment, "")); final CharacterPair blockComment = comments.blockComment; if (blockComment != null) { blockCommentStartText.setText(blockComment.open); @@ -120,22 +112,22 @@ public void refresh(@Nullable final LanguageConfiguration configuration) { } } - bracketsTable.setInput(removeNullElements(configuration.getBrackets())); + bracketsTable.setInput(configuration.getBrackets()); - autoClosingPairsTable.setInput(removeNullElements(configuration.getAutoClosingPairs())); + autoClosingPairsTable.setInput(configuration.getAutoClosingPairs()); final String autoCloseBefore = configuration.getAutoCloseBefore(); if (autoCloseBefore != null) { autoCloseBeforeText.setText(autoCloseBefore); } - surroundingPairsTable.setInput(removeNullElements(configuration.getSurroundingPairs())); + surroundingPairsTable.setInput(configuration.getSurroundingPairs()); final FoldingRules folding = configuration.getFolding(); if (folding != null) { - offsideText.setText(Boolean.toString(folding.offSide)); - markersStartText.setText(folding.markersStart.pattern()); - markersEndText.setText(folding.markersEnd.pattern()); + foldingOffsideText.setText(Boolean.toString(folding.offSide)); + foldingMarkersStartText.setText(folding.markersStart.pattern()); + foldingMarkersEndText.setText(folding.markersEnd.pattern()); } final String wordPattern = configuration.getWordPattern(); @@ -143,19 +135,11 @@ public void refresh(@Nullable final LanguageConfiguration configuration) { wordPatternText.setText(wordPattern); } - onEnterRuleTable.setInput(removeNullElements(configuration.getOnEnterRules())); - } - - @Nullable - private List removeNullElements(@Nullable final List list) { - if (list == null) { - return null; - } - return list.stream().filter(Objects::nonNull).toList(); + onEnterRuleTable.setInput(configuration.getOnEnterRules()); } private void createCommentsTab(final TabFolder folder) { - commentsTab = createTab(folder, LanguageConfigurationInfoWidget_comments); + commentsTab = createTab(folder, LanguageConfigurationInfoWidget_comments_title); final Composite parent = (Composite) commentsTab.getControl(); lineCommentText = createText(parent, LanguageConfigurationInfoWidget_lineComments); @@ -164,15 +148,13 @@ private void createCommentsTab(final TabFolder folder) { } private void createBracketsTab(final TabFolder folder) { - bracketsTab = createTab(folder, LanguageConfigurationInfoWidget_brackets); - bracketsTable = new CharacterPairsTableWidget(createTable((Composite) bracketsTab.getControl())); + bracketsTab = createTab(folder, LanguageConfigurationInfoWidget_brackets_title); + bracketsTable = new CharacterPairsTableWidget((Composite) bracketsTab.getControl()); } protected void createAutoClosingPairsTab(final TabFolder folder) { - autoClosingPairsTab = createTab(folder, - LanguageConfigurationInfoWidget_autoClosingPairs); - autoClosingPairsTable = new AutoClosingPairConditionalTableWidget( - createTable((Composite) autoClosingPairsTab.getControl())); + autoClosingPairsTab = createTab(folder, LanguageConfigurationInfoWidget_autoClosingPairs_title); + autoClosingPairsTable = new AutoClosingPairConditionalTableWidget((Composite) autoClosingPairsTab.getControl()); } private void createAutoCloseBeforeTab(final TabFolder folder) { @@ -183,20 +165,19 @@ private void createAutoCloseBeforeTab(final TabFolder folder) { } protected void createSurroundingPairsTab(final TabFolder folder) { - surroundingPairsTab = createTab(folder, LanguageConfigurationInfoWidget_surroundingPairs); - surroundingPairsTable = new CharacterPairsTableWidget( - createTable((Composite) surroundingPairsTab.getControl())); + surroundingPairsTab = createTab(folder, LanguageConfigurationInfoWidget_surroundingPairs_title); + surroundingPairsTable = new CharacterPairsTableWidget((Composite) surroundingPairsTab.getControl()); } private void createFoldingTab(final TabFolder folder) { foldingTab = createTab(folder, LanguageConfigurationInfoWidget_folding_title); final Composite parent = (Composite) foldingTab.getControl(); - offsideText = createText(parent, LanguageConfigurationInfoWidget_offSide); - offsideText.setToolTipText(LanguageConfigurationInfoWidget_offSide_tooltip); + foldingOffsideText = createText(parent, LanguageConfigurationInfoWidget_offSide); + foldingOffsideText.setToolTipText(LanguageConfigurationInfoWidget_offSide_tooltip); new Label(parent, SWT.NONE).setText(LanguageConfigurationInfoWidget_markers); - markersStartText = createText(parent, LanguageConfigurationInfoWidget_start); - markersEndText = createText(parent, LanguageConfigurationInfoWidget_end); + foldingMarkersStartText = createText(parent, LanguageConfigurationInfoWidget_start); + foldingMarkersEndText = createText(parent, LanguageConfigurationInfoWidget_end); } private void createWordPatternTab(final TabFolder folder) { @@ -207,19 +188,8 @@ private void createWordPatternTab(final TabFolder folder) { } protected void createOnEnterRulesTab(final TabFolder folder) { - onEnterRulesTab = createTab(folder, LanguageConfigurationInfoWidget_onEnterRules); - onEnterRuleTable = new OnEnterRuleTableWidget(createTable((Composite) onEnterRulesTab.getControl())); - } - - private Table createTable(final Composite parent) { - final var tableComposite = new Composite(parent, SWT.NONE); - tableComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); - tableComposite.setLayout(new TableColumnLayout()); - final var table = new Table(tableComposite, - SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); - table.setHeaderVisible(true); - table.setLinesVisible(true); - return table; + onEnterRulesTab = createTab(folder, LanguageConfigurationInfoWidget_onEnterRules_title); + onEnterRuleTable = new OnEnterRuleTableWidget((Composite) onEnterRulesTab.getControl()); } private TabItem createTab(final TabFolder folder, final String title) { diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/OnEnterRuleTableWidget.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/OnEnterRuleTableWidget.java index bb0481d9d..0f5c16129 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/OnEnterRuleTableWidget.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/OnEnterRuleTableWidget.java @@ -8,119 +8,44 @@ * * Contributors: * Lucas Bullen (Red Hat Inc.) - initial API and implementation + * Sebastian Thomschke - refactored to extend AbstractTableWidget */ package org.eclipse.tm4e.languageconfiguration.internal.widgets; import static org.eclipse.tm4e.languageconfiguration.internal.LanguageConfigurationMessages.*; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; - -import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.jface.layout.TableColumnLayout; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.viewers.ColumnWeightData; -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Composite; import org.eclipse.tm4e.languageconfiguration.internal.model.EnterAction; import org.eclipse.tm4e.languageconfiguration.internal.model.OnEnterRule; -final class OnEnterRuleTableWidget extends TableViewer { - - OnEnterRuleTableWidget(final Table table) { - super(table); - setContentProvider(new OnEnterRuleContentProvider()); - setLabelProvider(new OnEnterRuleLabelProvider()); - - final GC gc = new GC(table.getShell()); - gc.setFont(JFaceResources.getDialogFont()); - - final var colDefs = new LinkedHashMap(); - colDefs.put(OnEnterRuleTableWidget_beforeText, 2); - colDefs.put(OnEnterRuleTableWidget_afterText, 2); - colDefs.put(OnEnterRuleTableWidget_previousLineText, 2); - colDefs.put(OnEnterRuleTableWidget_indentAction, 1); - colDefs.put(OnEnterRuleTableWidget_appendText, 1); - colDefs.put(OnEnterRuleTableWidget_removeText, 1); +final class OnEnterRuleTableWidget extends AbstractTableWidget { - final var colLayout = new TableColumnLayout(); - for (final var colDef : colDefs.entrySet()) { - final var col = new TableColumn(table, SWT.NONE); - col.setText(colDef.getKey()); - final int minWidth = computeMinimumColumnWidth(gc, colDef.getKey()); - colLayout.setColumnData(col, new ColumnWeightData(colDef.getValue(), minWidth, true)); - } - - gc.dispose(); - } - - private int computeMinimumColumnWidth(final GC gc, final String string) { - return gc.stringExtent(string).x + 10; + OnEnterRuleTableWidget(final Composite parent) { + super(parent); } - private static final class OnEnterRuleContentProvider implements IStructuredContentProvider { - - private List onEnterRulesList = Collections.emptyList(); - - @Override - public Object[] getElements(final @Nullable Object input) { - return onEnterRulesList.toArray(OnEnterRule[]::new); - } - - @SuppressWarnings("unchecked") - @Override - public void inputChanged(final @Nullable Viewer viewer, final @Nullable Object oldInput, final @Nullable Object newInput) { - if (newInput == null) { - onEnterRulesList = Collections.emptyList(); - } else { - onEnterRulesList = (List) newInput; - } - } - - @Override - public void dispose() { - onEnterRulesList = Collections.emptyList(); - } + @Override + protected void createColumns() { + createColumn(OnEnterRuleTableWidget_beforeText, 2, 100, true); + createColumn(OnEnterRuleTableWidget_afterText, 2, 100, true); + createColumn(OnEnterRuleTableWidget_previousLineText, 2, 100, true); + createColumn(OnEnterRuleTableWidget_indentAction, 1, 0, true); + createColumn(OnEnterRuleTableWidget_appendText, 1, 0, true); + createColumn(OnEnterRuleTableWidget_removeText, 1, 0, true); } - private static final class OnEnterRuleLabelProvider extends LabelProvider implements ITableLabelProvider { - - @Override - public @Nullable Image getColumnImage(final @Nullable Object element, final int columnIndex) { - return null; - } - - @Override - public String getText(final @Nullable Object element) { - return getColumnText(element, 0); - } - - @Override - public String getColumnText(@Nullable final Object element, final int columnIndex) { - if (element == null) - return ""; - - final OnEnterRule rule = (OnEnterRule) element; - final EnterAction action = rule.action; - - return switch (columnIndex) { - case 0 -> rule.beforeText.pattern(); - case 1 -> rule.afterText != null ? rule.afterText.pattern() : ""; - case 2 -> rule.previousLineText != null ? rule.previousLineText.pattern() : ""; - case 3 -> action.indentAction.toString(); - case 4 -> action.appendText != null ? action.appendText : ""; - case 5 -> action.removeText != null ? action.removeText.toString() : ""; - default -> ""; - }; - } + @Override + protected String getColumnText(OnEnterRule rule, int columnIndex) { + final EnterAction action = rule.action; + + return switch (columnIndex) { + case 0 -> rule.beforeText.pattern(); + case 1 -> rule.afterText != null ? rule.afterText.pattern() : ""; + case 2 -> rule.previousLineText != null ? rule.previousLineText.pattern() : ""; + case 3 -> action.indentAction.toString(); + case 4 -> action.appendText != null ? action.appendText : ""; + case 5 -> action.removeText != null ? action.removeText.toString() : ""; + default -> ""; + }; } }