diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter.png b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter.png deleted file mode 100644 index 27c8738a7..000000000 Binary files a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter.png and /dev/null differ diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter@2x.png b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter@2x.png deleted file mode 100644 index 779bc07b1..000000000 Binary files a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter@2x.png and /dev/null differ diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter_disabled.png b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter_disabled.png deleted file mode 100644 index 3c39527ab..000000000 Binary files a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter_disabled.png and /dev/null differ diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter_disabled@2x.png b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter_disabled@2x.png deleted file mode 100644 index 9d482043c..000000000 Binary files a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/icons/filter_disabled@2x.png and /dev/null differ diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/dialogs/ToggleFiltersDialog.java b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/dialogs/ToggleFiltersDialog.java index 34ba8b9db..b57259f86 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/dialogs/ToggleFiltersDialog.java +++ b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/dialogs/ToggleFiltersDialog.java @@ -15,10 +15,11 @@ import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.swt.widgets.Shell; -import org.springframework.ide.eclipse.boot.dash.model.ToggleFiltersModel.FilterChoice; import org.springsource.ide.eclipse.commons.livexp.core.Validator; import org.springsource.ide.eclipse.commons.livexp.ui.ChooseMultipleSection; +import org.springsource.ide.eclipse.commons.livexp.ui.DescriptionSection; import org.springsource.ide.eclipse.commons.livexp.ui.DialogWithSections; +import org.springsource.ide.eclipse.commons.livexp.ui.StringFieldSection; import org.springsource.ide.eclipse.commons.livexp.ui.WizardPageSection; public class ToggleFiltersDialog extends DialogWithSections { @@ -38,13 +39,16 @@ public class ToggleFiltersDialog extends DialogWithSections { @Override protected List createSections() throws CoreException { - ChooseMultipleSection chooseFilters = - new ChooseMultipleSection(this, + return Arrays.asList( + new StringFieldSection(this, "Regex to match names of the elements to be shown", model.getRegExFilterLiveVar(), Validator.OK).vertical(true), + new ChooseMultipleSection<>(this, "Filters", model.getAvailableFilters(), model.getSelectedFilters(), - Validator.OK); - return Arrays.asList((WizardPageSection)chooseFilters); + Validator.OK, + model.getSelectedLiveVar()).vertical(true), + new DescriptionSection(this, model.getToggleFilterDescription()) + ); } } diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/dialogs/ToggleFiltersDialogModel.java b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/dialogs/ToggleFiltersDialogModel.java index 3935372ab..215dec1d2 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/dialogs/ToggleFiltersDialogModel.java +++ b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/dialogs/ToggleFiltersDialogModel.java @@ -12,7 +12,9 @@ package org.springframework.ide.eclipse.boot.dash.dialogs; import org.springframework.ide.eclipse.boot.dash.model.ToggleFiltersModel; import org.springframework.ide.eclipse.boot.dash.model.ToggleFiltersModel.FilterChoice; +import org.springsource.ide.eclipse.commons.livexp.core.LiveExpression; import org.springsource.ide.eclipse.commons.livexp.core.LiveSet; +import org.springsource.ide.eclipse.commons.livexp.core.LiveVariable; import org.springsource.ide.eclipse.commons.livexp.ui.OkButtonHandler; /** @@ -31,11 +33,24 @@ public class ToggleFiltersDialogModel implements OkButtonHandler { /** * Filters in the dialog (these get copied to the view when user pressed 'ok'). */ - private LiveSet selectedFilters = new LiveSet(); + private LiveSet selectedFilters = new LiveSet<>(); + + private LiveVariable regexFilter = new LiveVariable<>(); + + private LiveVariable selected = new LiveVariable<>(); + + private LiveExpression toggleFilterDescription = selected.apply(selected -> { + if (selected == null) { + return "Select a filter to see the description"; + } else { + return selected.getDescription(); + } + }); public ToggleFiltersDialogModel(ToggleFiltersModel viewModel) { this.viewModel = viewModel; selectedFilters.replaceAll(viewModel.getSelectedFilters().getValue()); + regexFilter = new LiveVariable<>(viewModel.getRegexFilter().getValue()); } public FilterChoice[] getAvailableFilters() { @@ -46,8 +61,25 @@ public class ToggleFiltersDialogModel implements OkButtonHandler { return selectedFilters; } + public LiveVariable getRegExFilterLiveVar() { + return regexFilter; + } + + public String getRegexFilter() { + return regexFilter.getValue(); + } + + public LiveExpression getToggleFilterDescription() { + return toggleFilterDescription; + } + + public LiveVariable getSelectedLiveVar() { + return selected; + } + @Override public void performOk() throws Exception { viewModel.getSelectedFilters().replaceAll(selectedFilters.getValue()); + viewModel.getRegexFilter().setValue(getRegexFilter()); } } diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/model/ToggleFiltersModel.java b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/model/ToggleFiltersModel.java index dbb99584e..5ac6044db 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/model/ToggleFiltersModel.java +++ b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/model/ToggleFiltersModel.java @@ -17,9 +17,11 @@ import org.eclipse.core.resources.IProject; import org.springsource.ide.eclipse.commons.core.pstore.IPropertyStore; import org.springsource.ide.eclipse.commons.core.pstore.PropertyStoreApi; import org.springsource.ide.eclipse.commons.core.pstore.PropertyStores; +import org.springsource.ide.eclipse.commons.frameworks.core.util.StringUtils; import org.springsource.ide.eclipse.commons.livexp.core.AsyncLiveExpression.AsyncMode; import org.springsource.ide.eclipse.commons.livexp.core.LiveExpression; import org.springsource.ide.eclipse.commons.livexp.core.LiveSetVariable; +import org.springsource.ide.eclipse.commons.livexp.core.LiveVariable; import org.springsource.ide.eclipse.commons.livexp.core.ValueListener; import org.springsource.ide.eclipse.commons.livexp.ui.Ilabelable; import org.springsource.ide.eclipse.commons.livexp.util.Filter; @@ -77,14 +79,45 @@ public class ToggleFiltersModel { } }; - public static final FilterChoice FILTER_CHOICE_HIDE_NON_WORKSPACE_ELEMENTS = new FilterChoice("hide.non-workspace", - "Hide non-workspace elements", HIDE_NON_WORKSPACE_ELEMENTS); - public static final FilterChoice FILTER_CHOICE_HIDE_SOLITARY_CONFS = new FilterChoice("hide.solitary-launch-config", - "Hide solitary launch configs", HIDE_SOLITARY_CONFS, true); - public static final FilterChoice FILTER_CHOICE_HIDE_LOCAL_SERVICES = new FilterChoice("hide.local-cloud-services", - "Hide local cloud services", HIDE_LOCAL_SERVICES, true); - public static final FilterChoice FILTER_CHOICE_HIDE_NOT_RUNNABLE_APPS = new FilterChoice("hide.not-runnable-apps", - "Hide local non-runnable apps", HIDE_LOCAL_NOT_RUNNABLE_APPS, true); + private final Filter REGEX_FILTER = new Filter() { + + @Override + public boolean accept(BootDashElement t) { + String regex = regexFilter.getValue(); + if (t.getName() != null && StringUtils.hasText(regex)) { + return t.getName().matches(regex); + } + return true; + } + + }; + + public static final FilterChoice FILTER_CHOICE_HIDE_NON_WORKSPACE_ELEMENTS = new FilterChoice( + "hide.non-workspace", + "Hide non-workspace elements", + "Elements not backed by a project in the workspaces will be not shown. For example elements fetched from Cloud Foundry instance.", + HIDE_NON_WORKSPACE_ELEMENTS); + + public static final FilterChoice FILTER_CHOICE_HIDE_SOLITARY_CONFS = new FilterChoice( + "hide.solitary-launch-config", + "Hide solitary launch configs", + "Launch configurations will not be shown if it the one and only configuration that exist for a Boot project or any other Boot Dashboard top level element", + HIDE_SOLITARY_CONFS, + true); + + public static final FilterChoice FILTER_CHOICE_HIDE_LOCAL_SERVICES = new FilterChoice( + "hide.local-cloud-services", + "Hide local cloud services", + "Local Spring Cloud Service coming from Spring Cloud CLI instance pointed to from STS preferences will not be shown", + HIDE_LOCAL_SERVICES, + true); + + public static final FilterChoice FILTER_CHOICE_HIDE_NOT_RUNNABLE_APPS = new FilterChoice( + "hide.not-runnable-apps", + "Hide local non-runnable apps", + "Spring Boot projects that cannot be laucnhed such as Spring Boot library projects not having a main method will not be shown", + HIDE_LOCAL_NOT_RUNNABLE_APPS, + true); private static final String STORE_ID = "toggle-filters"; private static final FilterChoice[] FILTERS = { @@ -94,6 +127,8 @@ public class ToggleFiltersModel { FILTER_CHOICE_HIDE_NOT_RUNNABLE_APPS }; + private static final String REGEX_FILTER_ID = "regexFilter"; + private final PropertyStoreApi persistentProperties; public ToggleFiltersModel(BootDashModelContext context) { @@ -103,13 +138,15 @@ public class ToggleFiltersModel { public ToggleFiltersModel(IPropertyStore propertyStore) { this.persistentProperties = new PropertyStoreApi(propertyStore); this.selectedFilters = new LiveSetVariable<>(restoreFilters(), AsyncMode.SYNC); + this.regexFilter = new LiveVariable<>(persistentProperties.get(REGEX_FILTER_ID)); this.compositeFilter = new LiveExpression>() { { dependsOn(selectedFilters); + dependsOn(regexFilter); } @Override protected Filter compute() { - Filter composed = Filters.acceptAll(); + Filter composed = REGEX_FILTER; for (FilterChoice chosen : selectedFilters.getValues()) { composed = Filters.compose(composed, chosen.getFilter()); } @@ -122,21 +159,36 @@ public class ToggleFiltersModel { saveFilters(value); } }); + + regexFilter.addListener((expr, v) -> { + try { + String value = expr.getValue(); + if (StringUtils.hasText(value)) { + persistentProperties.put(REGEX_FILTER_ID, value); + } else { + persistentProperties.put(REGEX_FILTER_ID, (String) null); + } + } catch (Exception e) { + Log.log(e); + } + }); } public static class FilterChoice implements Ilabelable { private final String id; private final String label; + private final String description; private final Filter filter; private final boolean defaultEnable; - public FilterChoice(String id, String label, Filter filter) { - this(id, label, filter, false); + public FilterChoice(String id, String label, String description, Filter filter) { + this(id, label, description, filter, false); } - public FilterChoice(String id, String label, Filter filter, boolean defaultEnable) { + public FilterChoice(String id, String label, String description, Filter filter, boolean defaultEnable) { this.id = id; this.label = label; + this.description = description; this.filter = filter; this.defaultEnable = defaultEnable; } @@ -151,6 +203,10 @@ public class ToggleFiltersModel { return label; } + public String getDescription() { + return description; + } + public Filter getFilter() { return filter; } @@ -161,6 +217,7 @@ public class ToggleFiltersModel { } private final LiveSetVariable selectedFilters; + private final LiveVariable regexFilter; private final LiveExpression> compositeFilter; /** @@ -203,4 +260,7 @@ public class ToggleFiltersModel { public LiveSetVariable getSelectedFilters() { return selectedFilters; } + public LiveVariable getRegexFilter() { + return regexFilter; + } } diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/BootDashActions.java b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/BootDashActions.java index 2111ebe7e..d9694d326 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/BootDashActions.java +++ b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/BootDashActions.java @@ -31,7 +31,6 @@ import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.IAction; import org.springframework.ide.eclipse.boot.core.BootActivator; -import org.springframework.ide.eclipse.boot.core.BootPreferences; import org.springframework.ide.eclipse.boot.dash.BootDashActivator; import org.springframework.ide.eclipse.boot.dash.api.RunTargetType; import org.springframework.ide.eclipse.boot.dash.cloudfoundry.deployment.DeployToRemoteTargetAction; @@ -86,7 +85,6 @@ public class BootDashActions { private ExposeAppAction exposeRunAppAction; private ExposeAppAction exposeDebugAppAction; - private OpenPreferencesAction openFilterPreferencesAction; private OpenPreferencesAction openBootDashPreferencesAction; private DuplicateConfigAction duplicateConfigAction; @@ -95,7 +93,6 @@ public class BootDashActions { private DeleteElementsAction deleteConfigsAction; private OpenToggleFiltersDialogAction toggleFiltersDialogAction; - private ToggleFilterAction[] toggleFilterActions; private CustmomizeTargetLabelAction customizeTargetLabelAction; private DisposingFactory debugOnTargetActions; @@ -296,10 +293,6 @@ public class BootDashActions { showPropertiesViewAction = new ShowViewAction(PROPERTIES_VIEW_ID); toggleFiltersDialogAction = new OpenToggleFiltersDialogAction(model.getToggleFilters(), elementsSelection, context); - toggleFilterActions = new ToggleFilterAction[model.getToggleFilters().getAvailableFilters().length]; - for (int i = 0; i < toggleFilterActions.length; i++) { - toggleFilterActions[i] = new ToggleFilterAction(model, model.getToggleFilters().getAvailableFilters()[i], context); - } exposeRunAppAction = new ExposeAppAction(defaultActionParams(), RunState.RUNNING, NGROKInstallManager.getInstance()); exposeRunAppAction.setText("(Re)start and Expose via ngrok"); @@ -318,10 +311,6 @@ public class BootDashActions { debugOnTargetActions = createDeployOnTargetActions(RunState.DEBUGGING); runOnTargetActions = createDeployOnTargetActions(RunState.RUNNING); - openFilterPreferencesAction = new OpenPreferencesAction(context, BootPreferences.BOOT_PREFERENCE_PAGE_ID, - "Boot Projects Filters Preferences...", - "Open Preferences for Spring Boot projects filters" - ); openBootDashPreferencesAction = new OpenPreferencesAction(context, BootDashPrefsPage.class.getName(), "Boot Dash UI Preferences...", "Open Preferences for Boot Dash" @@ -560,12 +549,6 @@ public class BootDashActions { duplicateConfigAction.dispose(); duplicateConfigAction = null; } - if (toggleFilterActions!=null) { - for (ToggleFilterAction a : toggleFilterActions) { - a.dispose(); - } - toggleFilterActions = null; - } debugOnTargetActions.dispose(); runOnTargetActions.dispose(); liveDataConnectionManagement.dispose(); @@ -579,10 +562,6 @@ public class BootDashActions { return duplicateConfigAction; } - public ToggleFilterAction[] getToggleFilterActions() { - return toggleFilterActions; - } - public CustmomizeTargetLabelAction getCustomizeTargetLabelAction() { return customizeTargetLabelAction; } @@ -594,10 +573,6 @@ public class BootDashActions { return getDeployAndStartOnTargetActions(runOnTargetActions); } - public OpenPreferencesAction getOpenFilterPreferencesAction() { - return openFilterPreferencesAction; - } - public IAction getOpenBootDashPreferencesAction() { return this.openBootDashPreferencesAction; } diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/BootDashTreeView.java b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/BootDashTreeView.java index fa196c61b..1b1b3d38e 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/BootDashTreeView.java +++ b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/BootDashTreeView.java @@ -16,7 +16,6 @@ import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuCreator; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; @@ -189,8 +188,11 @@ public class BootDashTreeView extends ViewPartWithSections implements ITabbedPro manager.add(actions.getOpenInPackageExplorerAction()); manager.add(actions.getOpenConfigAction()); manager.add(actions.getShowPropertiesViewAction()); + manager.add(actions.getToggleFiltersDialogAction()); + MenuUtil.addDynamicSubmenu(manager, actions.getLiveDataConnectionManagement()); + manager.add(new Separator()); manager.add(actions.getExposeRunAppAction()); manager.add(actions.getExposeDebugAppAction()); @@ -199,13 +201,6 @@ public class BootDashTreeView extends ViewPartWithSections implements ITabbedPro addAddRunTargetMenuActions(manager); manager.add(new Separator()); - //manager.add(actions.getToggleFiltersDialogAction()); - for (ToggleFilterAction a : actions.getToggleFilterActions()) { - manager.add(a); - } - - manager.add(new Separator()); - manager.add(actions.getOpenFilterPreferencesAction()); manager.add(actions.getOpenBootDashPreferencesAction()); // manager.add(refreshAction); diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/OpenToggleFiltersDialogAction.java b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/OpenToggleFiltersDialogAction.java index 24f4e17e2..e05813d29 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/OpenToggleFiltersDialogAction.java +++ b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/OpenToggleFiltersDialogAction.java @@ -10,17 +10,17 @@ *******************************************************************************/ package org.springframework.ide.eclipse.boot.dash.views; -import org.springframework.ide.eclipse.boot.dash.BootDashActivator; +import org.eclipse.jdt.internal.ui.JavaPluginImages; import org.springframework.ide.eclipse.boot.dash.di.SimpleDIContext; import org.springframework.ide.eclipse.boot.dash.dialogs.ToggleFiltersDialogModel; import org.springframework.ide.eclipse.boot.dash.livexp.MultiSelection; import org.springframework.ide.eclipse.boot.dash.model.BootDashElement; import org.springframework.ide.eclipse.boot.dash.model.ToggleFiltersModel; -import org.springframework.ide.eclipse.boot.dash.model.UserInteractions; /** * @author Kris De Volder */ +@SuppressWarnings("restriction") public class OpenToggleFiltersDialogAction extends AbstractBootDashAction { /** @@ -32,8 +32,8 @@ public class OpenToggleFiltersDialogAction extends AbstractBootDashAction { super(ui); this.viewModel = model; setText("Filters..."); - setImageDescriptor(BootDashActivator.getImageDescriptor("icons/filter.png")); - setDisabledImageDescriptor(BootDashActivator.getImageDescriptor("icons/filter_disabled.png")); + setImageDescriptor(JavaPluginImages.DESC_ELCL_FILTER); + setDisabledImageDescriptor(JavaPluginImages.DESC_DLCL_FILTER); } @Override diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/ToggleFilterAction.java b/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/ToggleFilterAction.java deleted file mode 100644 index ccdd1c869..000000000 --- a/eclipse-extensions/org.springframework.ide.eclipse.boot.dash/src/org/springframework/ide/eclipse/boot/dash/views/ToggleFilterAction.java +++ /dev/null @@ -1,78 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 Pivotal, Inc. - * 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 - * https://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Pivotal, Inc. - initial API and implementation - *******************************************************************************/ -package org.springframework.ide.eclipse.boot.dash.views; - -import org.eclipse.jface.action.IAction; -import org.springframework.ide.eclipse.boot.dash.di.SimpleDIContext; -import org.springframework.ide.eclipse.boot.dash.model.BootDashViewModel; -import org.springframework.ide.eclipse.boot.dash.model.ToggleFiltersModel; -import org.springframework.ide.eclipse.boot.dash.model.ToggleFiltersModel.FilterChoice; -import org.springframework.ide.eclipse.boot.dash.model.UserInteractions; -import org.springsource.ide.eclipse.commons.livexp.core.LiveExpression; -import org.springsource.ide.eclipse.commons.livexp.core.LiveSetVariable; -import org.springsource.ide.eclipse.commons.livexp.core.ValueListener; - -import com.google.common.collect.ImmutableSet; - -/** - * A checkbox-style menu action that enables / disables - * a particular 'toggle filter'. - * - * @author Kris De Volder - */ -public class ToggleFilterAction extends AbstractBootDashAction { - - private ToggleFiltersModel toggleFilters; - private ValueListener> selectedFilterListener; - final private FilterChoice filter; - - public ToggleFilterAction(BootDashViewModel model, FilterChoice filter, SimpleDIContext context) { - super(context, IAction.AS_CHECK_BOX); - this.filter = filter; - this.toggleFilters = model.getToggleFilters(); - this.setText(filter.getLabel()); - model.getToggleFilters().getSelectedFilters().addListener(selectedFilterListener=new ValueListener>() { - public void gotValue(LiveExpression> exp, ImmutableSet value) { - updateCheckedState(); - } - }); - } - - protected void updateCheckedState() { - setChecked(getModelCheckedState()); - } - - protected boolean getModelCheckedState() { - return toggleFilters.getSelectedFilters().getValues().contains(filter); - } - - protected void setModelCheckedState(boolean checked) { - LiveSetVariable activeFilters = toggleFilters.getSelectedFilters(); - if (checked) { - activeFilters.add(filter); - } else { - activeFilters.remove(filter); - } - } - - @Override - public void run() { - setModelCheckedState(!getModelCheckedState()); - } - - @Override - public void dispose() { - if (selectedFilterListener!=null) { - toggleFilters.getSelectedFilters().removeListener(selectedFilterListener); - } - super.dispose(); - } -} diff --git a/eclipse-language-servers/org.springsource.ide.eclipse.commons.livexp/src/org/springsource/ide/eclipse/commons/livexp/ui/ChooseMultipleSection.java b/eclipse-language-servers/org.springsource.ide.eclipse.commons.livexp/src/org/springsource/ide/eclipse/commons/livexp/ui/ChooseMultipleSection.java index d05abb5b6..eb8287b2b 100644 --- a/eclipse-language-servers/org.springsource.ide.eclipse.commons.livexp/src/org/springsource/ide/eclipse/commons/livexp/ui/ChooseMultipleSection.java +++ b/eclipse-language-servers/org.springsource.ide.eclipse.commons.livexp/src/org/springsource/ide/eclipse/commons/livexp/ui/ChooseMultipleSection.java @@ -19,6 +19,7 @@ import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; @@ -28,6 +29,7 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.springsource.ide.eclipse.commons.livexp.core.LiveExpression; import org.springsource.ide.eclipse.commons.livexp.core.LiveSet; +import org.springsource.ide.eclipse.commons.livexp.core.LiveVariable; import org.springsource.ide.eclipse.commons.livexp.core.ValidationResult; import org.springsource.ide.eclipse.commons.livexp.core.ValueListener; @@ -39,30 +41,49 @@ public class ChooseMultipleSection extends WizardPageSecti private Ilabelable[] validChoices; private LiveSet chosen; private LiveExpression validator; + private LiveVariable selected; + private boolean vertical; public ChooseMultipleSection(IPageWithSections owner, String labelText, T[] validChoices, LiveSet chosen, - LiveExpression validator + LiveExpression validator, + LiveVariable selected ) { super(owner); this.labelText = labelText; this.validChoices = validChoices; this.chosen = chosen; this.validator = validator; + this.selected = selected; + } + + public ChooseMultipleSection(IPageWithSections owner, + String labelText, + T[] validChoices, + LiveSet chosen, + LiveExpression validator + ) { + this(owner, labelText, validChoices, chosen, validator, null); } @Override public LiveExpression getValidator() { return validator; } + + public ChooseMultipleSection vertical(boolean vertical) { + this.vertical = vertical; + return this; + } + @SuppressWarnings("unchecked") @Override public void createContents(Composite page) { Composite composite = new Composite(page, SWT.NONE); GridLayout layout = new GridLayout(); - layout.numColumns = 2; + layout.numColumns = vertical ? 1 : 2; layout.marginWidth = 0; composite.setLayout(layout); GridDataFactory grab = GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, UIConstants.SCROLLABLE_LIST_HEIGTH); @@ -72,8 +93,8 @@ public class ChooseMultipleSection extends WizardPageSecti Label label = new Label(composite, SWT.NONE); label.setText(labelText); GridDataFactory.fillDefaults() - .align(SWT.CENTER, SWT.BEGINNING) - .hint(UIConstants.fieldLabelWidthHint(label), SWT.DEFAULT) + .align(SWT.BEGINNING, SWT.BEGINNING) + .hint(vertical ? SWT.DEFAULT : UIConstants.fieldLabelWidthHint(label), SWT.DEFAULT) .applyTo(label); CheckboxTableViewer tv = CheckboxTableViewer.newCheckList(composite, SWT.BORDER); @@ -95,6 +116,17 @@ public class ChooseMultipleSection extends WizardPageSecti } } }); + + if (selected != null) { + tv.addSelectionChangedListener(event -> { + IStructuredSelection structuredSelection = event.getStructuredSelection(); + if (structuredSelection.isEmpty()) { + selected.setValue(null); + } else { + selected.setValue((T)structuredSelection.getFirstElement()); + } + }); + } if (DEBUG) { chosen.addListener(new ValueListener>() { diff --git a/eclipse-language-servers/org.springsource.ide.eclipse.commons.livexp/src/org/springsource/ide/eclipse/commons/livexp/ui/StringFieldSection.java b/eclipse-language-servers/org.springsource.ide.eclipse.commons.livexp/src/org/springsource/ide/eclipse/commons/livexp/ui/StringFieldSection.java index 4ad4d72fc..1f6aee9fb 100644 --- a/eclipse-language-servers/org.springsource.ide.eclipse.commons.livexp/src/org/springsource/ide/eclipse/commons/livexp/ui/StringFieldSection.java +++ b/eclipse-language-servers/org.springsource.ide.eclipse.commons.livexp/src/org/springsource/ide/eclipse/commons/livexp/ui/StringFieldSection.java @@ -26,7 +26,6 @@ import org.springsource.ide.eclipse.commons.livexp.core.LiveVariable; import org.springsource.ide.eclipse.commons.livexp.core.UIValueListener; import org.springsource.ide.eclipse.commons.livexp.core.ValidationResult; import org.springsource.ide.eclipse.commons.livexp.core.Validator; -import org.springsource.ide.eclipse.commons.livexp.core.ValueListener; public class StringFieldSection extends WizardPageSection { @@ -42,6 +41,8 @@ public class StringFieldSection extends WizardPageSection { /// UI elements private Text text; private boolean password = false; + + private boolean vertical = false; ////////////////////////////// @@ -54,7 +55,15 @@ public class StringFieldSection extends WizardPageSection { this.variable = variable; this.validator = validator; } - + + /** + * Should be called before createContents(...) is called, i.e. before SWT controls are created. + */ + public StringFieldSection vertical(boolean vertical) { + this.vertical = vertical; + return this; + } + public StringFieldSection(IPageWithSections owner, FieldModel f) { this(owner, f.getLabel(), f.getVariable(), f.getValidator()); } @@ -75,19 +84,21 @@ public class StringFieldSection extends WizardPageSection { this.password = enablePasswordBehavior; return this; } - + @Override public void createContents(Composite page) { // project specification group Composite projectGroup = new Composite(page, SWT.NONE); - GridLayout layout = GridLayoutFactory.fillDefaults().numColumns(2).margins(0,2).create(); + + int columns = vertical ? 1 : 2; + GridLayout layout = GridLayoutFactory.fillDefaults().numColumns(columns).margins(0,2).create(); projectGroup.setLayout(layout); projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label label = new Label(projectGroup, SWT.NONE); label.setText(labelText); GridDataFactory.fillDefaults() - .hint(UIConstants.fieldLabelWidthHint(label), SWT.DEFAULT) + .hint(vertical ? SWT.DEFAULT : UIConstants.fieldLabelWidthHint(label), SWT.DEFAULT) .align(SWT.BEGINNING, SWT.CENTER) .applyTo(label);