Skip to content

Commit

Permalink
Support select all and copy shortcuts in chat (#353)
Browse files Browse the repository at this point in the history
* Support select all and copy keyboard shortcuts in chat

* Fix submitted code block cancel button (#354)

* Fix submitted code block cancel button

* Fix empty overflow bubble (#356)

* Fix empty pop-up when no overflow in follow up question text

* Fix accidentally removed copy event listener
  • Loading branch information
taldekar authored Feb 14, 2025
1 parent 58e74c6 commit cab750c
Showing 1 changed file with 105 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

package software.aws.toolkits.eclipse.amazonq.views;

import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.util.List;
import java.util.Optional;

Expand All @@ -26,6 +28,8 @@
import software.aws.toolkits.eclipse.amazonq.lsp.model.QuickActionsCommandGroup;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.util.ObjectMapperFactory;
import software.aws.toolkits.eclipse.amazonq.util.PluginPlatform;
import software.aws.toolkits.eclipse.amazonq.util.PluginUtils;
import software.aws.toolkits.eclipse.amazonq.util.ThreadingUtils;
import software.aws.toolkits.eclipse.amazonq.views.actions.AmazonQCommonActions;

Expand Down Expand Up @@ -91,6 +95,7 @@ public void completed(final ProgressEvent event) {
amazonQCommonActions = getAmazonQCommonActions();

chatCommunicationManager.setChatUiRequestListener(this);

new BrowserFunction(browser, "ideCommand") {
@Override
public Object function(final Object[] arguments) {
Expand All @@ -101,6 +106,24 @@ public Object function(final Object[] arguments) {
}
};

new BrowserFunction(browser, "isMacOs") {
@Override
public Object function(final Object[] arguments) {
return Boolean.TRUE.equals(PluginUtils.getPlatform() == PluginPlatform.MAC);
}
};

new BrowserFunction(browser, "copyToClipboard") {
@Override
public Object function(final Object[] arguments) {
if (arguments.length > 0 && arguments[0] instanceof String) {
StringSelection stringSelection = new StringSelection((String) arguments[0]);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
}
return null;
}
};

// Inject chat theme after mynah-ui has loaded
browser.addProgressListener(new ProgressAdapter() {
@Override
Expand Down Expand Up @@ -210,6 +233,16 @@ private String generateCss() {
mask-position: center;
scale: 60%;
}
.mynah-button.mynah-button-secondary.fill-state-always.code-snippet-close-button.mynah-ui-clickable-item
.mynah-ui-icon-cancel {
-webkit-mask-size: 187.5% !important;
mask-size: 187.5% !important;
mask-position: center;
aspect-ratio: 1/1;
width: 15px;
height: 15px;
scale: 50%
}
.mynah-ui-icon-tabs {
-webkit-mask-size: 102% !important;
mask-size: 102% !important;
Expand Down Expand Up @@ -272,7 +305,78 @@ private String generateJS(final String jsEntrypoint) {
});
}
});
</script>
window.addEventListener('load', () => {
const textarea = document.querySelector('textarea.mynah-chat-prompt-input');
if (textarea) {
textarea.addEventListener("keydown", (event) => {
if (((isMacOs() && event.metaKey) || (!isMacOs() && event.ctrlKey)) && event.key === 'a') {
textarea.select();
event.preventDefault();
event.stopPropagation();
}
});
}
});
window.addEventListener('load', () => {
const textarea = document.querySelector('textarea.mynah-chat-prompt-input');
if (textarea) {
textarea.addEventListener("keydown", (event) => {
if (((isMacOs() && event.metaKey) || (!isMacOs() && event.ctrlKey)) && event.key === 'c') {
copyToClipboard(textarea.value);
event.preventDefault();
event.stopPropagation();
}
});
}
});
const observer = new MutationObserver((mutations) => {
try {
mutations.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1) { // Check if it's an element node
// Check for direct match
if (node.matches('.mynah-button.mynah-button-secondary.mynah-button-border.fill-state-always.mynah-chat-item-followup-question-option.mynah-ui-clickable-item')) {
attachEventListeners(node);
}
// Check for nested matches
const buttons = node.querySelectorAll('.mynah-button.mynah-button-secondary.mynah-button-border.fill-state-always.mynah-chat-item-followup-question-option.mynah-ui-clickable-item');
buttons.forEach(attachEventListeners);
}
});
});
} catch (error) {
console.error('Error in mutation observer:', error);
}
});
function attachEventListeners(element) {
if (!element || element.dataset.hasListener) return; // Prevent duplicate listeners
element.addEventListener('mouseover', function(event) {
const textSpan = this.querySelector('span.mynah-button-label');
if (textSpan && textSpan.scrollWidth <= textSpan.offsetWidth) {
event.stopImmediatePropagation();
event.stopPropagation();
event.preventDefault();
}
}, true);
element.dataset.hasListener = 'true';
}
try {
observer.observe(document.body, {
childList: true,
subtree: true
});
} catch (error) {
console.error('Error starting observer:', error);
}
</script>
""", jsEntrypoint, getWaitFunction(), chatQuickActionConfig,
"true".equals(disclaimerAcknowledged));
}
Expand Down

0 comments on commit cab750c

Please sign in to comment.