From f15d7d2b4a056145f178f0de995ccf4deb06c4a8 Mon Sep 17 00:00:00 2001 From: Erin Harris Date: Wed, 31 Jul 2019 15:43:46 -0400 Subject: [PATCH] Issue #188: Allow user to select project styles --- .../internal/constants/ProjectLanguage.java | 11 ++ .../core/internal/constants/ProjectType.java | 12 ++ .../icons/obj16/menuDown.gif | Bin 0 -> 1602 bytes .../eclipse/codewind/ui/CodewindUIPlugin.java | 4 +- .../ui/internal/messages/Messages.java | 1 + .../ui/internal/messages/messages.properties | 3 +- .../wizards/NewCodewindProjectPage.java | 133 +++++++++++++++--- .../wizards/ProjectTypeSelectionPage.java | 26 +--- 8 files changed, 147 insertions(+), 43 deletions(-) create mode 100644 dev/org.eclipse.codewind.ui/icons/obj16/menuDown.gif diff --git a/dev/org.eclipse.codewind.core/src/org/eclipse/codewind/core/internal/constants/ProjectLanguage.java b/dev/org.eclipse.codewind.core/src/org/eclipse/codewind/core/internal/constants/ProjectLanguage.java index 274073c9a..b276ba821 100644 --- a/dev/org.eclipse.codewind.core/src/org/eclipse/codewind/core/internal/constants/ProjectLanguage.java +++ b/dev/org.eclipse.codewind.core/src/org/eclipse/codewind/core/internal/constants/ProjectLanguage.java @@ -56,5 +56,16 @@ public String getMetricsRoot() { return null; } } + + public static String getDisplayName(String languageId) { + if (languageId == null) { + return ProjectLanguage.LANGUAGE_UNKNOWN.getDisplayName(); + } + ProjectLanguage language = ProjectLanguage.getLanguage(languageId); + if (language != null && language != ProjectLanguage.LANGUAGE_UNKNOWN) { + return language.getDisplayName(); + } + return languageId; + } }; \ No newline at end of file diff --git a/dev/org.eclipse.codewind.core/src/org/eclipse/codewind/core/internal/constants/ProjectType.java b/dev/org.eclipse.codewind.core/src/org/eclipse/codewind/core/internal/constants/ProjectType.java index 8c00a0b9d..522f7347d 100644 --- a/dev/org.eclipse.codewind.core/src/org/eclipse/codewind/core/internal/constants/ProjectType.java +++ b/dev/org.eclipse.codewind.core/src/org/eclipse/codewind/core/internal/constants/ProjectType.java @@ -63,4 +63,16 @@ public static ProjectType getTypeFromLanguage(String language) { return null; } } + + public static String getDisplayName(String typeId) { + if (typeId == null) { + return ProjectType.TYPE_UNKNOWN.getDisplayName(); + } + ProjectType type = ProjectType.getType(typeId); + if (type != null && type != ProjectType.TYPE_UNKNOWN) { + return type.getDisplayName(); + } + return typeId; + } + } diff --git a/dev/org.eclipse.codewind.ui/icons/obj16/menuDown.gif b/dev/org.eclipse.codewind.ui/icons/obj16/menuDown.gif new file mode 100644 index 0000000000000000000000000000000000000000..5739069204f2641cb9b2cbf76ce0506906aed603 GIT binary patch literal 1602 zcmeH`F;1LO41{OJ1}zeikZ2U7JL{yW{ z?*yr6f}3BK?eWa`e-Gd8zuY{Y=vaR?BK+g0|2dScv`VT_rK(h|vRdj;r@GXwwhVO0 zDVN+bi9!)dCTXQc5)&Cw5gp-3O_mv1ksawMO|denqB_dan%>UnitcEK#b`Lg749%w zHAqS*!U+;=9pHfmi(ylnJrkALna9W_MlDw2 z2Q-<+4mcqgg|G$;(o8}N9xMhMXwQkJn=(0JE{2ilV=Y1mrIl@vnNQ?B`Wbqi_1 diff --git a/dev/org.eclipse.codewind.ui/src/org/eclipse/codewind/ui/internal/wizards/NewCodewindProjectPage.java b/dev/org.eclipse.codewind.ui/src/org/eclipse/codewind/ui/internal/wizards/NewCodewindProjectPage.java index 998458fc2..b2e17bbb0 100644 --- a/dev/org.eclipse.codewind.ui/src/org/eclipse/codewind/ui/internal/wizards/NewCodewindProjectPage.java +++ b/dev/org.eclipse.codewind.ui/src/org/eclipse/codewind/ui/internal/wizards/NewCodewindProjectPage.java @@ -13,6 +13,7 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.concurrent.TimeoutException; @@ -25,6 +26,9 @@ import org.eclipse.codewind.core.internal.ProcessHelper.ProcessResult; import org.eclipse.codewind.core.internal.connection.CodewindConnection; import org.eclipse.codewind.core.internal.console.ProjectTemplateInfo; +import org.eclipse.codewind.core.internal.constants.ProjectLanguage; +import org.eclipse.codewind.core.internal.constants.ProjectType; +import org.eclipse.codewind.ui.CodewindUIPlugin; import org.eclipse.codewind.ui.internal.messages.Messages; import org.eclipse.codewind.ui.internal.views.ViewHelper; import org.eclipse.core.resources.IProject; @@ -41,13 +45,20 @@ import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Point; 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.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; @@ -65,6 +76,7 @@ public class NewCodewindProjectPage extends WizardPage { private Table selectionTable; private Text descriptionLabel; private Text projectNameText; + private List styleList = new ArrayList(); protected NewCodewindProjectPage(CodewindConnection connection, List templateList) { super(Messages.NewProjectPage_ShellTitle); @@ -137,12 +149,20 @@ private void createContents(Composite parent) { layout.marginWidth = 8; layout.horizontalSpacing = 7; layout.verticalSpacing = 7; + layout.numColumns = 2; templateGroup.setLayout(layout); templateGroup.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1)); + // Style selection button + final Button styleButton = new Button(templateGroup, SWT.PUSH | SWT.RIGHT_TO_LEFT); + styleButton.setText("Select Styles"); + styleButton.setToolTipText("Select the styles to work with"); + styleButton.setImage(CodewindUIPlugin.getImage(CodewindUIPlugin.MENU_DOWN_ICON)); + styleButton.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false)); + // Filter text filterText = new Text(templateGroup, SWT.BORDER); - filterText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); + filterText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); filterText.setMessage(Messages.NewProjectPage_FilterMessage); // Table @@ -152,29 +172,38 @@ private void createContents(Composite parent) { selectionTable.setLayoutData(data); // Columns - final TableColumn featureColumn = new TableColumn(selectionTable, SWT.NONE); - featureColumn.setText(Messages.NewProjectPage_TypeColumn); - featureColumn.setResizable(true); - featureColumn.addSelectionListener(new SelectionAdapter() { + final TableColumn templateColumn = new TableColumn(selectionTable, SWT.NONE); + templateColumn.setText(Messages.NewProjectPage_TemplateColumn); + templateColumn.setResizable(true); + templateColumn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent event) { + sortTable(selectionTable, templateColumn); + } + }); + final TableColumn typeColumn = new TableColumn(selectionTable, SWT.NONE); + typeColumn.setText(Messages.NewProjectPage_TypeColumn); + typeColumn.setResizable(true); + typeColumn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { - sortTable(selectionTable, featureColumn); + sortTable(selectionTable, typeColumn); } }); - final TableColumn nameColumn = new TableColumn(selectionTable, SWT.NONE); - nameColumn.setText(Messages.NewProjectPage_LanguageColumn); - nameColumn.setResizable(true); - nameColumn.addSelectionListener(new SelectionAdapter() { + final TableColumn languageColumn = new TableColumn(selectionTable, SWT.NONE); + languageColumn.setText(Messages.NewProjectPage_LanguageColumn); + languageColumn.setResizable(true); + languageColumn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { - sortTable(selectionTable, nameColumn); + sortTable(selectionTable, languageColumn); } }); selectionTable.setHeaderVisible(true); selectionTable.setLinesVisible(false); selectionTable.setSortDirection(SWT.DOWN); - selectionTable.setSortColumn(featureColumn); + selectionTable.setSortColumn(templateColumn); createItems(selectionTable, ""); @@ -188,7 +217,7 @@ public void widgetSelected(SelectionEvent event) { descriptionLabel.setForeground(templateGroup.getForeground()); descriptionScroll.setContent(descriptionLabel); - data = new GridData(GridData.FILL, GridData.FILL, true, false); + data = new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1); int lineHeight = filterText.computeSize(SWT.DEFAULT, SWT.DEFAULT).y; data.heightHint = lineHeight * 2; data.horizontalSpan = 2; @@ -199,6 +228,17 @@ public void widgetSelected(SelectionEvent event) { descriptionScroll.setForeground(templateGroup.getForeground()); // Listeners + final Shell shell = getShell(); + styleButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + final Menu menu = new Menu(shell, SWT.POP_UP); + fillFilterMenu(menu); + displayDropdownMenu(styleButton, menu, true); + menu.dispose(); + } + }); + filterText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { @@ -303,18 +343,22 @@ private void createItems(Table table, String filter) { // Create the items for the table. table.removeAll(); pattern.setPattern("*" + filter + "*"); - for (ProjectTemplateInfo template : templateList) { - String type = template.getLabel(); - String language = template.getLanguage(); - if (pattern.matches(type) || (language != null && pattern.matches(language))) { + for (ProjectTemplateInfo templateInfo : templateList) { + String template = templateInfo.getLabel(); + String type = ProjectType.getDisplayName(templateInfo.getProjectType()); + String language = ProjectLanguage.getDisplayName(templateInfo.getLanguage()); + if (pattern.matches(template) || (type != null && pattern.matches(type)) || (language != null && pattern.matches(language))) { TableItem item = new TableItem(table, SWT.NONE); item.setForeground(table.getForeground()); item.setBackground(table.getBackground()); - item.setText(0, type); + item.setText(0, template); + if (type != null) { + item.setText(1, type); + } if (language != null) { - item.setText(1, language); + item.setText(2, language); } - item.setData(template); + item.setData(templateInfo); } } } @@ -476,4 +520,53 @@ private void getTemplates() { Logger.logError("An error occurred trying to get the list of templates", e); //$NON-NLS-1$ } } + + protected void fillFilterMenu(final Menu menu) { + final SelectionAdapter listener = new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent event) { + MenuItem item = (MenuItem) event.getSource(); + if (item.getSelection()) { + if (item.getData() == null) { + styleList.clear(); + } else { + styleList.add((Integer)item.getData()); + } + } else { + if (item.getData() != null) { + styleList.remove(item.getData()); + } + } + // Update template list + } + }; + + MenuItem item; + item = new MenuItem(menu, SWT.CHECK); + item.setText("All Styles"); + item.setSelection(styleList.isEmpty()); + item.addSelectionListener(listener); + for (int i = 1; i < 5; i++) { + item = new MenuItem(menu, SWT.CHECK); + item.setText("Style" + i); + item.setToolTipText("Description of style " + i + "\nSource of style " + i); + item.setData(new Integer(i)); + item.setSelection(styleList.contains(item.getData())); + item.addSelectionListener(listener); + } + } + + protected void displayDropdownMenu(Control anchor, Menu menu, boolean subtractWidth) { + Point size = anchor.getSize(); + Point point = anchor.toDisplay(0, size.y); + menu.setLocation(point.x - (subtractWidth ? size.x : 0), point.y); + menu.setVisible(true); + + while (!menu.isDisposed() && menu.isVisible()) { + Display display = menu.getShell().getDisplay(); + if (!display.readAndDispatch()) { + display.sleep(); + } + } + } } diff --git a/dev/org.eclipse.codewind.ui/src/org/eclipse/codewind/ui/internal/wizards/ProjectTypeSelectionPage.java b/dev/org.eclipse.codewind.ui/src/org/eclipse/codewind/ui/internal/wizards/ProjectTypeSelectionPage.java index 41a5cb85f..720f325ba 100644 --- a/dev/org.eclipse.codewind.ui/src/org/eclipse/codewind/ui/internal/wizards/ProjectTypeSelectionPage.java +++ b/dev/org.eclipse.codewind.ui/src/org/eclipse/codewind/ui/internal/wizards/ProjectTypeSelectionPage.java @@ -165,7 +165,7 @@ private String[] getProjectTypeArray() { Arrays.sort(types, new Comparator() { @Override public int compare(String t1, String t2) { - return getTypeDisplayName(t1).compareToIgnoreCase(getTypeDisplayName(t2)); + return ProjectType.getDisplayName(t1).compareToIgnoreCase(ProjectType.getDisplayName(t2)); } }); return types; @@ -180,7 +180,7 @@ private String[] getLanguageArray(String type) { Arrays.sort(languages, new Comparator() { @Override public int compare(String l1, String l2) { - return getLanguageDisplayName(l1).compareToIgnoreCase(getLanguageDisplayName(l2)); + return ProjectLanguage.getDisplayName(l1).compareToIgnoreCase(ProjectLanguage.getDisplayName(l2)); } }); return languages; @@ -195,19 +195,11 @@ public Image getImage(Object element) { @Override public String getText(Object element) { - return getTypeDisplayName((String)element); + return ProjectType.getDisplayName((String)element); } } - private String getTypeDisplayName(String typeId) { - ProjectType type = ProjectType.getType(typeId); - if (type != null && type != ProjectType.TYPE_UNKNOWN) { - return type.getDisplayName(); - } - return typeId; - } - private class LanguageLabelProvider extends LabelProvider { @Override @@ -217,18 +209,10 @@ public Image getImage(Object element) { @Override public String getText(Object element) { - return getLanguageDisplayName((String)element); - } - } - - private String getLanguageDisplayName(String languageId) { - ProjectLanguage language = ProjectLanguage.getLanguage(languageId); - if (language != null && language != ProjectLanguage.LANGUAGE_UNKNOWN) { - return language.getDisplayName(); + return ProjectLanguage.getDisplayName((String)element); } - return languageId; } - + public void setProject(IProject project) { this.project = project; updateTables();