From ececf749d0c79dd4febc285cc1738d670b1cf6f6 Mon Sep 17 00:00:00 2001 From: Paras Date: Tue, 24 Sep 2024 14:17:37 +0200 Subject: [PATCH 1/9] Show customizations dialog to login user --- .../amazonq/configuration/PluginStore.java | 4 + .../eclipse/amazonq/views/AmazonQView.java | 1 + .../amazonq/views/CustomizationDialog.java | 275 ++++++++++++++++++ .../views/actions/AmazonQCommonActions.java | 8 + .../CustomizationDialogContributionItem.java | 80 +++++ .../amazonq/views/model/Customization.java | 28 ++ 6 files changed, 396 insertions(+) create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/CustomizationDialogContributionItem.java create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java index 1c1b9a89..598b6f2b 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java @@ -27,4 +27,8 @@ public static String get(final String key) { return PREFERENCES.get(key, null); } + public static void remove(final String key) { + PREFERENCES.remove(key); + } + } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java index abf9293c..ef41d08f 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java @@ -97,6 +97,7 @@ private void setupAuthStatusListeners() { authStatusChangedListener = this::handleAuthStatusChange; AuthUtils.addAuthStatusChangeListener(amazonQCommonActions.getSignoutAction()); AuthUtils.addAuthStatusChangeListener(amazonQCommonActions.getFeedbackDialogContributionAction()); + AuthUtils.addAuthStatusChangeListener(amazonQCommonActions.getCustomizationDialogContributionAction()); } private void setupSelectionListener() { diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java new file mode 100644 index 00000000..f7a0e2ce --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java @@ -0,0 +1,275 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.views; + +import java.util.List; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +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.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import software.amazon.awssdk.utils.StringUtils; +import software.aws.toolkits.eclipse.amazonq.configuration.PluginStore; +import software.aws.toolkits.eclipse.amazonq.util.PluginLogger; +import software.aws.toolkits.eclipse.amazonq.views.model.Customization; + +public class CustomizationDialog extends Dialog { + + private static final String TITLE = "Amazon Q Customization"; + public static final String CUSTOMIZATION_STORAGE_INTERNAL_KEY = "aws.q.customization.eclipse"; + private static final String CUSTOMIZATION_STORAGE_LSP_KEY = "aws.q.customization"; + private Composite container; + private Font magnifiedFont; + private Font boldFont; + private List customizationsResponse; + private ResponseSelection responseSelection; + private String selectedCustomisationArn; + + public enum ResponseSelection { + AMAZON_Q_FOUNDATION_DEFAULT, + CUSTOMIZATION + } + + private class CustomRadioButton extends Composite { + private Button radioButton; + private Label textLabel; + private Label subtextLabel; + + public CustomRadioButton(final Composite parent, final String text, final String subText, final int style) { + super(parent, style); + Composite contentComposite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(2, false); + contentComposite.setLayout(gridLayout); + contentComposite.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); + + radioButton = new Button(contentComposite, SWT.RADIO); + radioButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); + + textLabel = createLabelWithFontSize(contentComposite, text, 16); + textLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); + + new Label(contentComposite, SWT.NONE); + + subtextLabel = createLabelWithFontSize(contentComposite, subText, 16); + subtextLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); + subtextLabel.setForeground(contentComposite.getDisplay().getSystemColor(SWT.COLOR_GRAY)); + } + + public final Button getRadioButton() { + return radioButton; + } + } + + public CustomizationDialog(final Shell parentShell) { + super(parentShell); + } + + public void setCustomisationResponse(final List customizationsResponse) { + this.customizationsResponse = customizationsResponse; + } + + public final List getCustomizationResponse() { + return this.customizationsResponse; + } + + public void setResponseSelection(final ResponseSelection responseSelection) { + this.responseSelection = responseSelection; + } + + public final ResponseSelection getResponseSelection() { + return this.responseSelection; + } + + public void setSelectedCustomizationArn(final String arn) { + this.selectedCustomisationArn = arn; + } + + public final String getSelectedCustomizationArn() { + return this.selectedCustomisationArn; + } + + @Override + protected final void createButtonsForButtonBar(final Composite parent) { + createButton(parent, IDialogConstants.OK_ID, "Select", true); + createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); + } + + @Override + protected final void okPressed() { + PluginLogger.info(String.format("Select pressed with responseSelection:%s and selectedArn:%s", this.responseSelection, this.selectedCustomisationArn)); + if (this.responseSelection.equals(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT)) { + PluginStore.remove(CUSTOMIZATION_STORAGE_INTERNAL_KEY); + } else { + // TODO: Add the logic to trigger notification to LSP server regarding change of configuration + PluginStore.put(CUSTOMIZATION_STORAGE_INTERNAL_KEY, this.selectedCustomisationArn); + } + super.okPressed(); + } + + private Font magnifyFontSize(final Font originalFont, final int fontSize) { + FontData[] fontData = originalFont.getFontData(); + for (int i = 0; i < fontData.length; i++) { + fontData[i].setHeight(fontSize); + } + Font magnifiedFont = new Font(getShell().getDisplay(), fontData); + if (this.magnifiedFont != null && !this.magnifiedFont.isDisposed()) { + this.magnifiedFont.dispose(); + } + this.magnifiedFont = magnifiedFont; + return magnifiedFont; + } + + private Font boldFont(final Font originalFont) { + FontData[] fontData = originalFont.getFontData(); + for (FontData data : fontData) { + data.setStyle(SWT.BOLD); + } + Font boldFont = new Font(getShell().getDisplay(), fontData); + if (this.boldFont != null && !this.boldFont.isDisposed()) { + this.boldFont.dispose(); + } + this.boldFont = boldFont; + return boldFont; + } + + private static void addFormattedOption(Combo combo, String name, String description) { + String formattedText = name + " (" + description + ")"; + combo.add(formattedText); + } + + private void createDropdownForCustomizations(final Composite parent) { + Composite contentComposite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(1, false); + layout.marginLeft = 15; + contentComposite.setLayout(layout); + contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + Combo combo = new Combo(contentComposite, SWT.READ_ONLY); + GridData comboGridData = new GridData(SWT.FILL, SWT.CENTER, true, false); + comboGridData.horizontalAlignment = GridData.FILL; + comboGridData.grabExcessHorizontalSpace = true; + combo.setLayoutData(comboGridData); + List customizations = this.customizationsResponse; + int defaultSelectedDropdownIndex = -1; + for (int index=0; index { + viewSite.getActionBars().getMenuManager().markDirty(); + viewSite.getActionBars().getMenuManager().update(true); + }); + } + + @Override + public void onAuthStatusChanged(final boolean isLoggedIn) { + updateVisibility(isLoggedIn); + } + + private List getCustomizations() { + List customizations = new ArrayList<>(); + customizations.add(new Customization("customization-arn-1", "Customization 1", "Code Whisperer customization 1")); + customizations.add(new Customization("customization-arn-2", "Customization 2", "Code Whisperer customization 2")); + customizations.add(new Customization("customization-arn-3", "Customization 3", "Code Whisperer customization 3")); + return customizations; + } + + @Override + public void fill(Menu menu, int index) { + MenuItem menuItem = new MenuItem(menu, SWT.NONE, index); + menuItem.setText(CUSTOMIZATION_MENU_ITEM_TEXT); + menuItem.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + CustomizationDialog dialog = new CustomizationDialog(shell); + // TODO: This mock will be replaced by an actual call to LSP + dialog.setCustomisationResponse(getCustomizations()); + String storedCustomizationArn = PluginStore.get(CustomizationDialog.CUSTOMIZATION_STORAGE_INTERNAL_KEY); + if (StringUtils.isBlank(storedCustomizationArn)) { + dialog.setResponseSelection(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT); + dialog.setSelectedCustomizationArn(null); + } else { + dialog.setResponseSelection(ResponseSelection.CUSTOMIZATION); + dialog.setSelectedCustomizationArn(storedCustomizationArn); + } + dialog.open(); + } + }); + } +} diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java new file mode 100644 index 00000000..7ed4d532 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java @@ -0,0 +1,28 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.views.model; + +public class Customization { + private final String arn; + private final String name; + private final String description; + + public Customization(final String arn, final String name, final String description) { + this.arn = arn; + this.name = name; + this.description = description; + } + + public final String getArn() { + return this.arn; + } + + public final String getName() { + return this.name; + } + + public final String getDescription() { + return this.description; + } +} \ No newline at end of file From 458d9724fd31eaf977859466f929bc4222a89c92 Mon Sep 17 00:00:00 2001 From: Paras Date: Tue, 24 Sep 2024 15:34:44 +0200 Subject: [PATCH 2/9] Fix bold font and dialog size --- .../toolkits/eclipse/amazonq/views/CustomizationDialog.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java index f7a0e2ce..cae2f469 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java @@ -191,7 +191,7 @@ protected final Control createDialogArea(final Composite parent) { container.setLayout(gridLayout); container.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); Label heading = createLabelWithFontSize(container, "Select an Amazon Q customization", 18); - boldFont(heading.getFont()); + heading.setFont(boldFont(heading.getFont())); Boolean isDefaultAmazonQFoundationSelected = this.responseSelection.equals(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT); CustomRadioButton defaultAmazonQFoundationButton = createCustomRadioButton(container, "Amazon Q foundation (Default)", "Receive suggestions from Amazon Q base model.", SWT.NONE, isDefaultAmazonQFoundationSelected); @@ -244,7 +244,7 @@ protected final void configureShell(final Shell newShell) { @Override protected final Point getInitialSize() { - return new Point(600, 450); + return new Point(550, 400); } @Override From ab30876f721f91da385035332f2210b704dae4b3 Mon Sep 17 00:00:00 2001 From: Paras Date: Tue, 24 Sep 2024 15:50:50 +0200 Subject: [PATCH 3/9] Combo dropdown disable when radio button of customization is unselected --- .../eclipse/amazonq/views/CustomizationDialog.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java index cae2f469..f6a73317 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java @@ -31,6 +31,7 @@ public class CustomizationDialog extends Dialog { public static final String CUSTOMIZATION_STORAGE_INTERNAL_KEY = "aws.q.customization.eclipse"; private static final String CUSTOMIZATION_STORAGE_LSP_KEY = "aws.q.customization"; private Composite container; + private Combo combo; private Font magnifiedFont; private Font boldFont; private List customizationsResponse; @@ -155,7 +156,7 @@ private void createDropdownForCustomizations(final Composite parent) { layout.marginLeft = 15; contentComposite.setLayout(layout); contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - Combo combo = new Combo(contentComposite, SWT.READ_ONLY); + combo = new Combo(contentComposite, SWT.READ_ONLY); GridData comboGridData = new GridData(SWT.FILL, SWT.CENTER, true, false); comboGridData.horizontalAlignment = GridData.FILL; comboGridData.grabExcessHorizontalSpace = true; @@ -172,6 +173,9 @@ private void createDropdownForCustomizations(final Composite parent) { } } combo.select(defaultSelectedDropdownIndex); + if (this.responseSelection.equals(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT)) { + combo.setEnabled(false); + } combo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { @@ -203,6 +207,7 @@ public void widgetSelected(SelectionEvent e) { customizationButton.getRadioButton().setSelection(false); responseSelection = ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT; selectedCustomisationArn = null; + combo.setEnabled(false); } }); customizationButton.getRadioButton().addSelectionListener(new SelectionAdapter() { @@ -210,6 +215,7 @@ public void widgetSelected(SelectionEvent e) { public void widgetSelected(SelectionEvent e) { defaultAmazonQFoundationButton.getRadioButton().setSelection(false); responseSelection = ResponseSelection.CUSTOMIZATION; + combo.setEnabled(true); } }); createDropdownForCustomizations(container); From 96708006371f9d77ee6769eb91d7f720fba7b431 Mon Sep 17 00:00:00 2001 From: Paras Date: Tue, 24 Sep 2024 14:17:37 +0200 Subject: [PATCH 4/9] Show customizations dialog to login user --- .../amazonq/configuration/PluginStore.java | 4 + .../eclipse/amazonq/views/AmazonQView.java | 1 + .../amazonq/views/CustomizationDialog.java | 275 ++++++++++++++++++ .../views/actions/AmazonQCommonActions.java | 8 + .../CustomizationDialogContributionItem.java | 80 +++++ .../amazonq/views/model/Customization.java | 28 ++ 6 files changed, 396 insertions(+) create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/CustomizationDialogContributionItem.java create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java index 1c1b9a89..598b6f2b 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java @@ -27,4 +27,8 @@ public static String get(final String key) { return PREFERENCES.get(key, null); } + public static void remove(final String key) { + PREFERENCES.remove(key); + } + } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java index e772f485..1c51a7de 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java @@ -94,6 +94,7 @@ private void setupAuthStatusListeners() { authStatusChangedListener = this::handleAuthStatusChange; AuthUtils.addAuthStatusChangeListener(amazonQCommonActions.getSignoutAction()); AuthUtils.addAuthStatusChangeListener(amazonQCommonActions.getFeedbackDialogContributionAction()); + AuthUtils.addAuthStatusChangeListener(amazonQCommonActions.getCustomizationDialogContributionAction()); } @Override diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java new file mode 100644 index 00000000..f7a0e2ce --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java @@ -0,0 +1,275 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.views; + +import java.util.List; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +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.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import software.amazon.awssdk.utils.StringUtils; +import software.aws.toolkits.eclipse.amazonq.configuration.PluginStore; +import software.aws.toolkits.eclipse.amazonq.util.PluginLogger; +import software.aws.toolkits.eclipse.amazonq.views.model.Customization; + +public class CustomizationDialog extends Dialog { + + private static final String TITLE = "Amazon Q Customization"; + public static final String CUSTOMIZATION_STORAGE_INTERNAL_KEY = "aws.q.customization.eclipse"; + private static final String CUSTOMIZATION_STORAGE_LSP_KEY = "aws.q.customization"; + private Composite container; + private Font magnifiedFont; + private Font boldFont; + private List customizationsResponse; + private ResponseSelection responseSelection; + private String selectedCustomisationArn; + + public enum ResponseSelection { + AMAZON_Q_FOUNDATION_DEFAULT, + CUSTOMIZATION + } + + private class CustomRadioButton extends Composite { + private Button radioButton; + private Label textLabel; + private Label subtextLabel; + + public CustomRadioButton(final Composite parent, final String text, final String subText, final int style) { + super(parent, style); + Composite contentComposite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(2, false); + contentComposite.setLayout(gridLayout); + contentComposite.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); + + radioButton = new Button(contentComposite, SWT.RADIO); + radioButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); + + textLabel = createLabelWithFontSize(contentComposite, text, 16); + textLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); + + new Label(contentComposite, SWT.NONE); + + subtextLabel = createLabelWithFontSize(contentComposite, subText, 16); + subtextLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); + subtextLabel.setForeground(contentComposite.getDisplay().getSystemColor(SWT.COLOR_GRAY)); + } + + public final Button getRadioButton() { + return radioButton; + } + } + + public CustomizationDialog(final Shell parentShell) { + super(parentShell); + } + + public void setCustomisationResponse(final List customizationsResponse) { + this.customizationsResponse = customizationsResponse; + } + + public final List getCustomizationResponse() { + return this.customizationsResponse; + } + + public void setResponseSelection(final ResponseSelection responseSelection) { + this.responseSelection = responseSelection; + } + + public final ResponseSelection getResponseSelection() { + return this.responseSelection; + } + + public void setSelectedCustomizationArn(final String arn) { + this.selectedCustomisationArn = arn; + } + + public final String getSelectedCustomizationArn() { + return this.selectedCustomisationArn; + } + + @Override + protected final void createButtonsForButtonBar(final Composite parent) { + createButton(parent, IDialogConstants.OK_ID, "Select", true); + createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); + } + + @Override + protected final void okPressed() { + PluginLogger.info(String.format("Select pressed with responseSelection:%s and selectedArn:%s", this.responseSelection, this.selectedCustomisationArn)); + if (this.responseSelection.equals(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT)) { + PluginStore.remove(CUSTOMIZATION_STORAGE_INTERNAL_KEY); + } else { + // TODO: Add the logic to trigger notification to LSP server regarding change of configuration + PluginStore.put(CUSTOMIZATION_STORAGE_INTERNAL_KEY, this.selectedCustomisationArn); + } + super.okPressed(); + } + + private Font magnifyFontSize(final Font originalFont, final int fontSize) { + FontData[] fontData = originalFont.getFontData(); + for (int i = 0; i < fontData.length; i++) { + fontData[i].setHeight(fontSize); + } + Font magnifiedFont = new Font(getShell().getDisplay(), fontData); + if (this.magnifiedFont != null && !this.magnifiedFont.isDisposed()) { + this.magnifiedFont.dispose(); + } + this.magnifiedFont = magnifiedFont; + return magnifiedFont; + } + + private Font boldFont(final Font originalFont) { + FontData[] fontData = originalFont.getFontData(); + for (FontData data : fontData) { + data.setStyle(SWT.BOLD); + } + Font boldFont = new Font(getShell().getDisplay(), fontData); + if (this.boldFont != null && !this.boldFont.isDisposed()) { + this.boldFont.dispose(); + } + this.boldFont = boldFont; + return boldFont; + } + + private static void addFormattedOption(Combo combo, String name, String description) { + String formattedText = name + " (" + description + ")"; + combo.add(formattedText); + } + + private void createDropdownForCustomizations(final Composite parent) { + Composite contentComposite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(1, false); + layout.marginLeft = 15; + contentComposite.setLayout(layout); + contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + Combo combo = new Combo(contentComposite, SWT.READ_ONLY); + GridData comboGridData = new GridData(SWT.FILL, SWT.CENTER, true, false); + comboGridData.horizontalAlignment = GridData.FILL; + comboGridData.grabExcessHorizontalSpace = true; + combo.setLayoutData(comboGridData); + List customizations = this.customizationsResponse; + int defaultSelectedDropdownIndex = -1; + for (int index=0; index { + viewSite.getActionBars().getMenuManager().markDirty(); + viewSite.getActionBars().getMenuManager().update(true); + }); + } + + @Override + public void onAuthStatusChanged(final boolean isLoggedIn) { + updateVisibility(isLoggedIn); + } + + private List getCustomizations() { + List customizations = new ArrayList<>(); + customizations.add(new Customization("customization-arn-1", "Customization 1", "Code Whisperer customization 1")); + customizations.add(new Customization("customization-arn-2", "Customization 2", "Code Whisperer customization 2")); + customizations.add(new Customization("customization-arn-3", "Customization 3", "Code Whisperer customization 3")); + return customizations; + } + + @Override + public void fill(Menu menu, int index) { + MenuItem menuItem = new MenuItem(menu, SWT.NONE, index); + menuItem.setText(CUSTOMIZATION_MENU_ITEM_TEXT); + menuItem.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + CustomizationDialog dialog = new CustomizationDialog(shell); + // TODO: This mock will be replaced by an actual call to LSP + dialog.setCustomisationResponse(getCustomizations()); + String storedCustomizationArn = PluginStore.get(CustomizationDialog.CUSTOMIZATION_STORAGE_INTERNAL_KEY); + if (StringUtils.isBlank(storedCustomizationArn)) { + dialog.setResponseSelection(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT); + dialog.setSelectedCustomizationArn(null); + } else { + dialog.setResponseSelection(ResponseSelection.CUSTOMIZATION); + dialog.setSelectedCustomizationArn(storedCustomizationArn); + } + dialog.open(); + } + }); + } +} diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java new file mode 100644 index 00000000..7ed4d532 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java @@ -0,0 +1,28 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.views.model; + +public class Customization { + private final String arn; + private final String name; + private final String description; + + public Customization(final String arn, final String name, final String description) { + this.arn = arn; + this.name = name; + this.description = description; + } + + public final String getArn() { + return this.arn; + } + + public final String getName() { + return this.name; + } + + public final String getDescription() { + return this.description; + } +} \ No newline at end of file From 303d5240f2fd123b3c188f571915969fe2924f24 Mon Sep 17 00:00:00 2001 From: Paras Date: Tue, 24 Sep 2024 15:34:44 +0200 Subject: [PATCH 5/9] Fix bold font and dialog size --- .../toolkits/eclipse/amazonq/views/CustomizationDialog.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java index f7a0e2ce..cae2f469 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java @@ -191,7 +191,7 @@ protected final Control createDialogArea(final Composite parent) { container.setLayout(gridLayout); container.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); Label heading = createLabelWithFontSize(container, "Select an Amazon Q customization", 18); - boldFont(heading.getFont()); + heading.setFont(boldFont(heading.getFont())); Boolean isDefaultAmazonQFoundationSelected = this.responseSelection.equals(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT); CustomRadioButton defaultAmazonQFoundationButton = createCustomRadioButton(container, "Amazon Q foundation (Default)", "Receive suggestions from Amazon Q base model.", SWT.NONE, isDefaultAmazonQFoundationSelected); @@ -244,7 +244,7 @@ protected final void configureShell(final Shell newShell) { @Override protected final Point getInitialSize() { - return new Point(600, 450); + return new Point(550, 400); } @Override From 494a64ec571ceb74d24a92476c4946a630d7882a Mon Sep 17 00:00:00 2001 From: Paras Date: Tue, 24 Sep 2024 15:50:50 +0200 Subject: [PATCH 6/9] Combo dropdown disable when radio button of customization is unselected --- .../eclipse/amazonq/views/CustomizationDialog.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java index cae2f469..f6a73317 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java @@ -31,6 +31,7 @@ public class CustomizationDialog extends Dialog { public static final String CUSTOMIZATION_STORAGE_INTERNAL_KEY = "aws.q.customization.eclipse"; private static final String CUSTOMIZATION_STORAGE_LSP_KEY = "aws.q.customization"; private Composite container; + private Combo combo; private Font magnifiedFont; private Font boldFont; private List customizationsResponse; @@ -155,7 +156,7 @@ private void createDropdownForCustomizations(final Composite parent) { layout.marginLeft = 15; contentComposite.setLayout(layout); contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - Combo combo = new Combo(contentComposite, SWT.READ_ONLY); + combo = new Combo(contentComposite, SWT.READ_ONLY); GridData comboGridData = new GridData(SWT.FILL, SWT.CENTER, true, false); comboGridData.horizontalAlignment = GridData.FILL; comboGridData.grabExcessHorizontalSpace = true; @@ -172,6 +173,9 @@ private void createDropdownForCustomizations(final Composite parent) { } } combo.select(defaultSelectedDropdownIndex); + if (this.responseSelection.equals(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT)) { + combo.setEnabled(false); + } combo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { @@ -203,6 +207,7 @@ public void widgetSelected(SelectionEvent e) { customizationButton.getRadioButton().setSelection(false); responseSelection = ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT; selectedCustomisationArn = null; + combo.setEnabled(false); } }); customizationButton.getRadioButton().addSelectionListener(new SelectionAdapter() { @@ -210,6 +215,7 @@ public void widgetSelected(SelectionEvent e) { public void widgetSelected(SelectionEvent e) { defaultAmazonQFoundationButton.getRadioButton().setSelection(false); responseSelection = ResponseSelection.CUSTOMIZATION; + combo.setEnabled(true); } }); createDropdownForCustomizations(container); From 931f86a3002e12f0ad392675039ca0fc25943bef Mon Sep 17 00:00:00 2001 From: Paras Date: Wed, 25 Sep 2024 10:21:06 +0200 Subject: [PATCH 7/9] Change subtext color to dark gray & capitalizing 'C'ustomization --- .../toolkits/eclipse/amazonq/views/CustomizationDialog.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java index f6a73317..a225b9fc 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java @@ -65,7 +65,7 @@ public CustomRadioButton(final Composite parent, final String text, final String subtextLabel = createLabelWithFontSize(contentComposite, subText, 16); subtextLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); - subtextLabel.setForeground(contentComposite.getDisplay().getSystemColor(SWT.COLOR_GRAY)); + subtextLabel.setForeground(contentComposite.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY)); } public final Button getRadioButton() { @@ -194,7 +194,7 @@ protected final Control createDialogArea(final Composite parent) { GridLayout gridLayout = new GridLayout(1, false); container.setLayout(gridLayout); container.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); - Label heading = createLabelWithFontSize(container, "Select an Amazon Q customization", 18); + Label heading = createLabelWithFontSize(container, "Select an Amazon Q Customization", 18); heading.setFont(boldFont(heading.getFont())); Boolean isDefaultAmazonQFoundationSelected = this.responseSelection.equals(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT); CustomRadioButton defaultAmazonQFoundationButton = createCustomRadioButton(container, "Amazon Q foundation (Default)", From 3f6688dc536ebc80e684904da3faae5b4d641959 Mon Sep 17 00:00:00 2001 From: Paras Date: Wed, 25 Sep 2024 13:48:59 +0200 Subject: [PATCH 8/9] Fix padding around body of dialog and dialog size --- .../eclipse/amazonq/views/CustomizationDialog.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java index a225b9fc..135e5741 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java @@ -50,7 +50,7 @@ private class CustomRadioButton extends Composite { public CustomRadioButton(final Composite parent, final String text, final String subText, final int style) { super(parent, style); - Composite contentComposite = new Composite(parent, SWT.NONE); + Composite contentComposite = new Composite(parent, SWT.FILL); GridLayout gridLayout = new GridLayout(2, false); contentComposite.setLayout(gridLayout); contentComposite.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); @@ -153,9 +153,9 @@ private static void addFormattedOption(Combo combo, String name, String descript private void createDropdownForCustomizations(final Composite parent) { Composite contentComposite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(1, false); - layout.marginLeft = 15; + layout.marginLeft = 18; contentComposite.setLayout(layout); - contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); combo = new Combo(contentComposite, SWT.READ_ONLY); GridData comboGridData = new GridData(SWT.FILL, SWT.CENTER, true, false); comboGridData.horizontalAlignment = GridData.FILL; @@ -192,6 +192,10 @@ public void widgetSelected(SelectionEvent e) { protected final Control createDialogArea(final Composite parent) { container = (Composite) super.createDialogArea(parent); GridLayout gridLayout = new GridLayout(1, false); + gridLayout.marginLeft = 10; + gridLayout.marginRight = 10; + gridLayout.marginTop = 10; + gridLayout.marginBottom = 10; container.setLayout(gridLayout); container.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); Label heading = createLabelWithFontSize(container, "Select an Amazon Q Customization", 18); @@ -250,7 +254,7 @@ protected final void configureShell(final Shell newShell) { @Override protected final Point getInitialSize() { - return new Point(550, 400); + return new Point(600, 450); } @Override From 916ae8fca3b636b08bbefc9316858d1237339e48 Mon Sep 17 00:00:00 2001 From: Paras Date: Mon, 30 Sep 2024 15:45:55 +0200 Subject: [PATCH 9/9] Fix UI padding and formatting --- .../amazonq/configuration/PluginStore.java | 2 +- .../amazonq/views/CustomizationDialog.java | 146 +++++++++--------- .../CustomizationDialogContributionItem.java | 46 +++--- .../amazonq/views/model/Customization.java | 44 +++--- 4 files changed, 123 insertions(+), 115 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java index 598b6f2b..972f5744 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/configuration/PluginStore.java @@ -28,7 +28,7 @@ public static String get(final String key) { } public static void remove(final String key) { - PREFERENCES.remove(key); + PREFERENCES.remove(key); } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java index 135e5741..ae7d7e27 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CustomizationDialog.java @@ -25,11 +25,10 @@ import software.aws.toolkits.eclipse.amazonq.util.PluginLogger; import software.aws.toolkits.eclipse.amazonq.views.model.Customization; -public class CustomizationDialog extends Dialog { +public final class CustomizationDialog extends Dialog { private static final String TITLE = "Amazon Q Customization"; public static final String CUSTOMIZATION_STORAGE_INTERNAL_KEY = "aws.q.customization.eclipse"; - private static final String CUSTOMIZATION_STORAGE_LSP_KEY = "aws.q.customization"; private Composite container; private Combo combo; private Font magnifiedFont; @@ -39,16 +38,16 @@ public class CustomizationDialog extends Dialog { private String selectedCustomisationArn; public enum ResponseSelection { - AMAZON_Q_FOUNDATION_DEFAULT, - CUSTOMIZATION + AMAZON_Q_FOUNDATION_DEFAULT, + CUSTOMIZATION } - private class CustomRadioButton extends Composite { + private final class CustomRadioButton extends Composite { private Button radioButton; private Label textLabel; private Label subtextLabel; - public CustomRadioButton(final Composite parent, final String text, final String subText, final int style) { + CustomRadioButton(final Composite parent, final String text, final String subText, final int style) { super(parent, style); Composite contentComposite = new Composite(parent, SWT.FILL); GridLayout gridLayout = new GridLayout(2, false); @@ -60,15 +59,15 @@ public CustomRadioButton(final Composite parent, final String text, final String textLabel = createLabelWithFontSize(contentComposite, text, 16); textLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); - + new Label(contentComposite, SWT.NONE); - + subtextLabel = createLabelWithFontSize(contentComposite, subText, 16); subtextLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); subtextLabel.setForeground(contentComposite.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY)); } - public final Button getRadioButton() { + public Button getRadioButton() { return radioButton; } } @@ -78,43 +77,43 @@ public CustomizationDialog(final Shell parentShell) { } public void setCustomisationResponse(final List customizationsResponse) { - this.customizationsResponse = customizationsResponse; + this.customizationsResponse = customizationsResponse; } - public final List getCustomizationResponse() { - return this.customizationsResponse; + public List getCustomizationResponse() { + return this.customizationsResponse; } public void setResponseSelection(final ResponseSelection responseSelection) { - this.responseSelection = responseSelection; + this.responseSelection = responseSelection; } - public final ResponseSelection getResponseSelection() { - return this.responseSelection; + public ResponseSelection getResponseSelection() { + return this.responseSelection; } public void setSelectedCustomizationArn(final String arn) { - this.selectedCustomisationArn = arn; + this.selectedCustomisationArn = arn; } - public final String getSelectedCustomizationArn() { - return this.selectedCustomisationArn; + public String getSelectedCustomizationArn() { + return this.selectedCustomisationArn; } @Override - protected final void createButtonsForButtonBar(final Composite parent) { + protected void createButtonsForButtonBar(final Composite parent) { createButton(parent, IDialogConstants.OK_ID, "Select", true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } @Override - protected final void okPressed() { + protected void okPressed() { PluginLogger.info(String.format("Select pressed with responseSelection:%s and selectedArn:%s", this.responseSelection, this.selectedCustomisationArn)); if (this.responseSelection.equals(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT)) { - PluginStore.remove(CUSTOMIZATION_STORAGE_INTERNAL_KEY); + PluginStore.remove(CUSTOMIZATION_STORAGE_INTERNAL_KEY); } else { - // TODO: Add the logic to trigger notification to LSP server regarding change of configuration - PluginStore.put(CUSTOMIZATION_STORAGE_INTERNAL_KEY, this.selectedCustomisationArn); + // TODO: Add the logic to trigger notification to LSP server regarding change of configuration + PluginStore.put(CUSTOMIZATION_STORAGE_INTERNAL_KEY, this.selectedCustomisationArn); } super.okPressed(); } @@ -131,54 +130,58 @@ private Font magnifyFontSize(final Font originalFont, final int fontSize) { this.magnifiedFont = magnifiedFont; return magnifiedFont; } - + private Font boldFont(final Font originalFont) { - FontData[] fontData = originalFont.getFontData(); - for (FontData data : fontData) { - data.setStyle(SWT.BOLD); - } - Font boldFont = new Font(getShell().getDisplay(), fontData); + FontData[] fontData = originalFont.getFontData(); + for (FontData data : fontData) { + data.setStyle(SWT.BOLD); + } + Font boldFont = new Font(getShell().getDisplay(), fontData); if (this.boldFont != null && !this.boldFont.isDisposed()) { this.boldFont.dispose(); } this.boldFont = boldFont; - return boldFont; + return boldFont; } - - private static void addFormattedOption(Combo combo, String name, String description) { + + private static void addFormattedOption(final Combo combo, final String name, final String description) { String formattedText = name + " (" + description + ")"; combo.add(formattedText); } - + private void createDropdownForCustomizations(final Composite parent) { - Composite contentComposite = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(1, false); - layout.marginLeft = 18; + Composite contentComposite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(2, false); + layout.marginLeft = 18; contentComposite.setLayout(layout); - contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); + layoutData.horizontalSpan = 2; + contentComposite.setLayoutData(layoutData); combo = new Combo(contentComposite, SWT.READ_ONLY); + combo.setLayout(new GridLayout()); GridData comboGridData = new GridData(SWT.FILL, SWT.CENTER, true, false); comboGridData.horizontalAlignment = GridData.FILL; comboGridData.grabExcessHorizontalSpace = true; + comboGridData.horizontalSpan = 2; combo.setLayoutData(comboGridData); List customizations = this.customizationsResponse; int defaultSelectedDropdownIndex = -1; - for (int index=0; index { viewSite.getActionBars().getMenuManager().markDirty(); viewSite.getActionBars().getMenuManager().update(true); @@ -46,33 +46,33 @@ public void updateVisibility(final boolean isLoggedIn) { public void onAuthStatusChanged(final boolean isLoggedIn) { updateVisibility(isLoggedIn); } - + private List getCustomizations() { - List customizations = new ArrayList<>(); - customizations.add(new Customization("customization-arn-1", "Customization 1", "Code Whisperer customization 1")); - customizations.add(new Customization("customization-arn-2", "Customization 2", "Code Whisperer customization 2")); - customizations.add(new Customization("customization-arn-3", "Customization 3", "Code Whisperer customization 3")); - return customizations; + List customizations = new ArrayList<>(); + customizations.add(new Customization("customization-arn-1", "Customization 1", "Code Whisperer customization 1")); + customizations.add(new Customization("customization-arn-2", "Customization 2", "Code Whisperer customization 2")); + customizations.add(new Customization("customization-arn-3", "Customization 3", "Code Whisperer customization 3")); + return customizations; } - + @Override - public void fill(Menu menu, int index) { + public void fill(final Menu menu, final int index) { MenuItem menuItem = new MenuItem(menu, SWT.NONE, index); menuItem.setText(CUSTOMIZATION_MENU_ITEM_TEXT); menuItem.addSelectionListener(new SelectionAdapter() { @Override - public void widgetSelected(SelectionEvent e) { - CustomizationDialog dialog = new CustomizationDialog(shell); - // TODO: This mock will be replaced by an actual call to LSP - dialog.setCustomisationResponse(getCustomizations()); - String storedCustomizationArn = PluginStore.get(CustomizationDialog.CUSTOMIZATION_STORAGE_INTERNAL_KEY); - if (StringUtils.isBlank(storedCustomizationArn)) { - dialog.setResponseSelection(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT); - dialog.setSelectedCustomizationArn(null); - } else { - dialog.setResponseSelection(ResponseSelection.CUSTOMIZATION); - dialog.setSelectedCustomizationArn(storedCustomizationArn); - } + public void widgetSelected(final SelectionEvent e) { + CustomizationDialog dialog = new CustomizationDialog(shell); + // TODO: This mock will be replaced by an actual call to LSP + dialog.setCustomisationResponse(getCustomizations()); + String storedCustomizationArn = PluginStore.get(CustomizationDialog.CUSTOMIZATION_STORAGE_INTERNAL_KEY); + if (StringUtils.isBlank(storedCustomizationArn)) { + dialog.setResponseSelection(ResponseSelection.AMAZON_Q_FOUNDATION_DEFAULT); + dialog.setSelectedCustomizationArn(null); + } else { + dialog.setResponseSelection(ResponseSelection.CUSTOMIZATION); + dialog.setSelectedCustomizationArn(storedCustomizationArn); + } dialog.open(); } }); diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java index 7ed4d532..2609bec8 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Customization.java @@ -4,25 +4,25 @@ package software.aws.toolkits.eclipse.amazonq.views.model; public class Customization { - private final String arn; - private final String name; - private final String description; - - public Customization(final String arn, final String name, final String description) { - this.arn = arn; - this.name = name; - this.description = description; - } - - public final String getArn() { - return this.arn; - } - - public final String getName() { - return this.name; - } - - public final String getDescription() { - return this.description; - } -} \ No newline at end of file + private final String arn; + private final String name; + private final String description; + + public Customization(final String arn, final String name, final String description) { + this.arn = arn; + this.name = name; + this.description = description; + } + + public final String getArn() { + return this.arn; + } + + public final String getName() { + return this.name; + } + + public final String getDescription() { + return this.description; + } +}