Support to redefine icons for LSP client - #3459

Merged
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3
Jan 18, 2022
Merged

Support to redefine icons for LSP client#3459
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3

Conversation

@sdedic

@sdedicsdedic commented Jan 15, 2022

Copy link
Copy Markdown
Member

I reworked the stuff originally in #3414 to a state hopefully acceptable for NB13 before freeze/branching. Overview

Openide changes

  • ImageUtilities just formalize PROPERTY_URL in API + implementation bugfixes

LSP / VSCode changes

  • UIDefaults are patched at startup, with ImageUtilities.loadImages converted to icons for keys that are actually present. Replacement table is in a resource file. Stub image is replicated at build time, and mapped to images not mapped explicitly (just listed).
  • regexps in vscode client adjusted.

@sdedic
sdedic requested review from JaroslavTulach, eirikbakke, entlicher and neilcsmith-net and removed request for entlicherJanuary 15, 2022 11:39
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ea07e73 to ae3badeCompareJanuary 15, 2022 11:42
@sdedicsdedic changed the title Vscode/redefined icons3Support to redefine icons for LSP clientJan 15, 2022
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ae3bade to cfddb16CompareJanuary 15, 2022 12:10

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for splitting out this digestible PR; looks good. I read over everything, though assuming that the LSP stuff was reviewed before by someone more familiar with that part of the codebase.

See in-code comments... main changes requested was fixing a double equals in a properties file and adding a comment to UIDefaultsIconMetadata to make it clear that it doesn't run during normal IDE execution.

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the updates!

@sdedicsdedic self-assigned this Jan 16, 2022
@sdedicsdedic added this to the NB13 milestone Jan 16, 2022
@sdedicsdedic added enhancement LSP [ci] enable Language Server Protocol tests VSCode Extension API Change [ci] enable extra API related tests Need Squashing labels Jan 16, 2022

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you double check the static initialization logic in ImageUtilities. Then please squash and merge when ready. Will be branching for NB13 later today.

Comment threadplatform/openide.util.ui/src/org/openide/util/ImageUtilities.java Outdated
if (EventQueue.isDispatchThread()) {
dummyIconComponent = new JLabel();
dummyIconComponentLabel = new JLabel();
dummyIconComponentButton = new JCheckBox();

@eirikbakkeeirikbakkeJan 17, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're doing a JCheckBox here instead of a JButton, the variable should be called dummyIconComponentCheckBox.

But remind me why we are doing a JCheckBox? I know it extends JButton but unless you know of specific cases that need it, I'd prefer to just have a JButton. Otherwise the hacks start getting too specific, and we'll be afraid to change them in the future.

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

During development of the UIDefaults replacing code, I used ImageUtilities on real icons served by UIManager (default LaF). Several of them had special implementations that downcast the Component to JCheckbox in their paint(). Having a JCheckbox satisfies more icons than just JButton (there are such icons as well) I tried to choose the class that covered most of the errors.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, as long as you saw actual cases, that's fine. What do you mean by "using ImageUtilities"; which method(s) specifically? And which LAF was this? (Which OS?) Why haven't these cases come up before?

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which method(s) specifically

ImageUtilities.icon2Image; that ultimately calls paintIcon() to get the icon rendered to a BufferedImage. OS Linux / KDE, JDK 8+11, default L&F.

Why haven't these cases come up before?

Nobody called icon2Image on those particular UIManager icons ?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the reasoning is captured fine in the comment above too.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it's fine with me. Just wondering if these were problems caused due to aggressive manual testing only, or whether they actually occur during real use.

*/
public static URL findImageBaseURL(Image image) {
Object o = image.getProperty(PROPERTY_URL, null);
return o instanceof URL ? (URL)o : null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space after ")", if you're doing another round of changes...

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, let's get it in before branching.

@neilcsmith-net

neilcsmith-net commented Jan 17, 2022

Copy link
Copy Markdown
Member

@sdedic actually, hold on! Travis CI VSCode test is broken. Lots of logged java.lang.NoClassDefFoundError: Could not initialize class org.openide.util.ImageUtilities.

java.lang.NullPointerException: The image parameter cannot be null
[junit] at org.openide.util.Parameters.notNull(Parameters.java:64)
[junit] at org.openide.util.ImageUtilities.assignToolTipToImageInternal(ImageUtilities.java:397)
[junit] at org.openide.util.ImageUtilities.image2Icon(ImageUtilities.java:328)
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)
[junit] at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:216)
[junit] at javax.swing.UIDefaults.get(UIDefaults.java:161)
...
[junit] at javax.swing.JCheckBox.<init>(JCheckBox.java:174)
...
[junit] Caused: java.lang.ExceptionInInitializerError
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)

Coincidence that that's with JCheckbox, or because of previous fix?

@neilcsmith-net
neilcsmith-net self-requested a review January 17, 2022 15:39
@eirikbakke

Copy link
Copy Markdown
Contributor

@neilcsmith-net ImageUtilities.image2Icon(ImageUtilities.loadImage(resImage)) is suspect in any case, since loadImage can return null and image2Icon does not accept null.

@sdedicsdedic added the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 17, 2022
@neilcsmith-net

Copy link
Copy Markdown
Member

@sdedic I need to proceed with branching. Once available, please rebase this on delivery.

@sdedic

Copy link
Copy Markdown
MemberAuthor

Got it, running tests. Will rebase.

@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from 5791131 to 2fbce60CompareJanuary 17, 2022 17:13
@sdedic
sdedic changed the base branch from master to deliveryJanuary 17, 2022 17:13
@sdedic

Copy link
Copy Markdown
MemberAuthor

Seems that when the 1st call to ImageUtilities happened in the EDT (seemed not the case when running as a headless NBLS server or as an IDE, but did in the test), UIDefaultsIconMetadata attempted to call back to stil-not-initialized class ImageUtilities that resulted in CDNFE; at least when running locally.

@neilcsmith-net

Copy link
Copy Markdown
Member

Thanks! See, I knew that would cause a bug somewhere, or that fixing it would. 😆

Bit of a backlog in tests with all the branching and merging today. Please merge when it goes green.

@neilcsmith-net
neilcsmith-net merged commit 2b91be1 into apache:deliveryJan 18, 2022
@neilcsmith-netneilcsmith-net removed the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 19, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

API Change[ci] enable extra API related testsenhancementLSP[ci] enable Language Server Protocol testsVSCode Extension

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@sdedic@neilcsmith-net@eirikbakke@jtulach
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Support to redefine icons for LSP client - #3459

Merged
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3
Jan 18, 2022
Merged

Support to redefine icons for LSP client#3459
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3

Conversation

@sdedic

@sdedicsdedic commented Jan 15, 2022

Copy link
Copy Markdown
Member

I reworked the stuff originally in #3414 to a state hopefully acceptable for NB13 before freeze/branching. Overview

Openide changes

  • ImageUtilities just formalize PROPERTY_URL in API + implementation bugfixes

LSP / VSCode changes

  • UIDefaults are patched at startup, with ImageUtilities.loadImages converted to icons for keys that are actually present. Replacement table is in a resource file. Stub image is replicated at build time, and mapped to images not mapped explicitly (just listed).
  • regexps in vscode client adjusted.

@sdedic
sdedic requested review from JaroslavTulach, eirikbakke, entlicher and neilcsmith-net and removed request for entlicherJanuary 15, 2022 11:39
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ea07e73 to ae3badeCompareJanuary 15, 2022 11:42
@sdedicsdedic changed the title Vscode/redefined icons3Support to redefine icons for LSP clientJan 15, 2022
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ae3bade to cfddb16CompareJanuary 15, 2022 12:10

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for splitting out this digestible PR; looks good. I read over everything, though assuming that the LSP stuff was reviewed before by someone more familiar with that part of the codebase.

See in-code comments... main changes requested was fixing a double equals in a properties file and adding a comment to UIDefaultsIconMetadata to make it clear that it doesn't run during normal IDE execution.

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the updates!

@sdedicsdedic self-assigned this Jan 16, 2022
@sdedicsdedic added this to the NB13 milestone Jan 16, 2022
@sdedicsdedic added enhancement LSP [ci] enable Language Server Protocol tests VSCode Extension API Change [ci] enable extra API related tests Need Squashing labels Jan 16, 2022

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you double check the static initialization logic in ImageUtilities. Then please squash and merge when ready. Will be branching for NB13 later today.

Comment threadplatform/openide.util.ui/src/org/openide/util/ImageUtilities.java Outdated
if (EventQueue.isDispatchThread()) {
dummyIconComponent = new JLabel();
dummyIconComponentLabel = new JLabel();
dummyIconComponentButton = new JCheckBox();

@eirikbakkeeirikbakkeJan 17, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're doing a JCheckBox here instead of a JButton, the variable should be called dummyIconComponentCheckBox.

But remind me why we are doing a JCheckBox? I know it extends JButton but unless you know of specific cases that need it, I'd prefer to just have a JButton. Otherwise the hacks start getting too specific, and we'll be afraid to change them in the future.

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

During development of the UIDefaults replacing code, I used ImageUtilities on real icons served by UIManager (default LaF). Several of them had special implementations that downcast the Component to JCheckbox in their paint(). Having a JCheckbox satisfies more icons than just JButton (there are such icons as well) I tried to choose the class that covered most of the errors.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, as long as you saw actual cases, that's fine. What do you mean by "using ImageUtilities"; which method(s) specifically? And which LAF was this? (Which OS?) Why haven't these cases come up before?

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which method(s) specifically

ImageUtilities.icon2Image; that ultimately calls paintIcon() to get the icon rendered to a BufferedImage. OS Linux / KDE, JDK 8+11, default L&F.

Why haven't these cases come up before?

Nobody called icon2Image on those particular UIManager icons ?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the reasoning is captured fine in the comment above too.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it's fine with me. Just wondering if these were problems caused due to aggressive manual testing only, or whether they actually occur during real use.

*/
public static URL findImageBaseURL(Image image) {
Object o = image.getProperty(PROPERTY_URL, null);
return o instanceof URL ? (URL)o : null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space after ")", if you're doing another round of changes...

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, let's get it in before branching.

@neilcsmith-net

neilcsmith-net commented Jan 17, 2022

Copy link
Copy Markdown
Member

@sdedic actually, hold on! Travis CI VSCode test is broken. Lots of logged java.lang.NoClassDefFoundError: Could not initialize class org.openide.util.ImageUtilities.

java.lang.NullPointerException: The image parameter cannot be null
[junit] at org.openide.util.Parameters.notNull(Parameters.java:64)
[junit] at org.openide.util.ImageUtilities.assignToolTipToImageInternal(ImageUtilities.java:397)
[junit] at org.openide.util.ImageUtilities.image2Icon(ImageUtilities.java:328)
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)
[junit] at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:216)
[junit] at javax.swing.UIDefaults.get(UIDefaults.java:161)
...
[junit] at javax.swing.JCheckBox.<init>(JCheckBox.java:174)
...
[junit] Caused: java.lang.ExceptionInInitializerError
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)

Coincidence that that's with JCheckbox, or because of previous fix?

@neilcsmith-net
neilcsmith-net self-requested a review January 17, 2022 15:39
@eirikbakke

Copy link
Copy Markdown
Contributor

@neilcsmith-net ImageUtilities.image2Icon(ImageUtilities.loadImage(resImage)) is suspect in any case, since loadImage can return null and image2Icon does not accept null.

@sdedicsdedic added the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 17, 2022
@neilcsmith-net

Copy link
Copy Markdown
Member

@sdedic I need to proceed with branching. Once available, please rebase this on delivery.

@sdedic

Copy link
Copy Markdown
MemberAuthor

Got it, running tests. Will rebase.

@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from 5791131 to 2fbce60CompareJanuary 17, 2022 17:13
@sdedic
sdedic changed the base branch from master to deliveryJanuary 17, 2022 17:13
@sdedic

Copy link
Copy Markdown
MemberAuthor

Seems that when the 1st call to ImageUtilities happened in the EDT (seemed not the case when running as a headless NBLS server or as an IDE, but did in the test), UIDefaultsIconMetadata attempted to call back to stil-not-initialized class ImageUtilities that resulted in CDNFE; at least when running locally.

@neilcsmith-net

Copy link
Copy Markdown
Member

Thanks! See, I knew that would cause a bug somewhere, or that fixing it would. 😆

Bit of a backlog in tests with all the branching and merging today. Please merge when it goes green.

@neilcsmith-net
neilcsmith-net merged commit 2b91be1 into apache:deliveryJan 18, 2022
@neilcsmith-netneilcsmith-net removed the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 19, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

API Change[ci] enable extra API related testsenhancementLSP[ci] enable Language Server Protocol testsVSCode Extension

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@sdedic@neilcsmith-net@eirikbakke@jtulach
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Support to redefine icons for LSP client - #3459

Merged
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3
Jan 18, 2022
Merged

Support to redefine icons for LSP client#3459
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3

Conversation

@sdedic

@sdedicsdedic commented Jan 15, 2022

Copy link
Copy Markdown
Member

I reworked the stuff originally in #3414 to a state hopefully acceptable for NB13 before freeze/branching. Overview

Openide changes

  • ImageUtilities just formalize PROPERTY_URL in API + implementation bugfixes

LSP / VSCode changes

  • UIDefaults are patched at startup, with ImageUtilities.loadImages converted to icons for keys that are actually present. Replacement table is in a resource file. Stub image is replicated at build time, and mapped to images not mapped explicitly (just listed).
  • regexps in vscode client adjusted.

@sdedic
sdedic requested review from JaroslavTulach, eirikbakke, entlicher and neilcsmith-net and removed request for entlicherJanuary 15, 2022 11:39
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ea07e73 to ae3badeCompareJanuary 15, 2022 11:42
@sdedicsdedic changed the title Vscode/redefined icons3Support to redefine icons for LSP clientJan 15, 2022
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ae3bade to cfddb16CompareJanuary 15, 2022 12:10

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for splitting out this digestible PR; looks good. I read over everything, though assuming that the LSP stuff was reviewed before by someone more familiar with that part of the codebase.

See in-code comments... main changes requested was fixing a double equals in a properties file and adding a comment to UIDefaultsIconMetadata to make it clear that it doesn't run during normal IDE execution.

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the updates!

@sdedicsdedic self-assigned this Jan 16, 2022
@sdedicsdedic added this to the NB13 milestone Jan 16, 2022
@sdedicsdedic added enhancement LSP [ci] enable Language Server Protocol tests VSCode Extension API Change [ci] enable extra API related tests Need Squashing labels Jan 16, 2022

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you double check the static initialization logic in ImageUtilities. Then please squash and merge when ready. Will be branching for NB13 later today.

Comment threadplatform/openide.util.ui/src/org/openide/util/ImageUtilities.java Outdated
if (EventQueue.isDispatchThread()) {
dummyIconComponent = new JLabel();
dummyIconComponentLabel = new JLabel();
dummyIconComponentButton = new JCheckBox();

@eirikbakkeeirikbakkeJan 17, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're doing a JCheckBox here instead of a JButton, the variable should be called dummyIconComponentCheckBox.

But remind me why we are doing a JCheckBox? I know it extends JButton but unless you know of specific cases that need it, I'd prefer to just have a JButton. Otherwise the hacks start getting too specific, and we'll be afraid to change them in the future.

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

During development of the UIDefaults replacing code, I used ImageUtilities on real icons served by UIManager (default LaF). Several of them had special implementations that downcast the Component to JCheckbox in their paint(). Having a JCheckbox satisfies more icons than just JButton (there are such icons as well) I tried to choose the class that covered most of the errors.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, as long as you saw actual cases, that's fine. What do you mean by "using ImageUtilities"; which method(s) specifically? And which LAF was this? (Which OS?) Why haven't these cases come up before?

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which method(s) specifically

ImageUtilities.icon2Image; that ultimately calls paintIcon() to get the icon rendered to a BufferedImage. OS Linux / KDE, JDK 8+11, default L&F.

Why haven't these cases come up before?

Nobody called icon2Image on those particular UIManager icons ?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the reasoning is captured fine in the comment above too.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it's fine with me. Just wondering if these were problems caused due to aggressive manual testing only, or whether they actually occur during real use.

*/
public static URL findImageBaseURL(Image image) {
Object o = image.getProperty(PROPERTY_URL, null);
return o instanceof URL ? (URL)o : null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space after ")", if you're doing another round of changes...

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, let's get it in before branching.

@neilcsmith-net

neilcsmith-net commented Jan 17, 2022

Copy link
Copy Markdown
Member

@sdedic actually, hold on! Travis CI VSCode test is broken. Lots of logged java.lang.NoClassDefFoundError: Could not initialize class org.openide.util.ImageUtilities.

java.lang.NullPointerException: The image parameter cannot be null
[junit] at org.openide.util.Parameters.notNull(Parameters.java:64)
[junit] at org.openide.util.ImageUtilities.assignToolTipToImageInternal(ImageUtilities.java:397)
[junit] at org.openide.util.ImageUtilities.image2Icon(ImageUtilities.java:328)
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)
[junit] at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:216)
[junit] at javax.swing.UIDefaults.get(UIDefaults.java:161)
...
[junit] at javax.swing.JCheckBox.<init>(JCheckBox.java:174)
...
[junit] Caused: java.lang.ExceptionInInitializerError
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)

Coincidence that that's with JCheckbox, or because of previous fix?

@neilcsmith-net
neilcsmith-net self-requested a review January 17, 2022 15:39
@eirikbakke

Copy link
Copy Markdown
Contributor

@neilcsmith-net ImageUtilities.image2Icon(ImageUtilities.loadImage(resImage)) is suspect in any case, since loadImage can return null and image2Icon does not accept null.

@sdedicsdedic added the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 17, 2022
@neilcsmith-net

Copy link
Copy Markdown
Member

@sdedic I need to proceed with branching. Once available, please rebase this on delivery.

@sdedic

Copy link
Copy Markdown
MemberAuthor

Got it, running tests. Will rebase.

@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from 5791131 to 2fbce60CompareJanuary 17, 2022 17:13
@sdedic
sdedic changed the base branch from master to deliveryJanuary 17, 2022 17:13
@sdedic

Copy link
Copy Markdown
MemberAuthor

Seems that when the 1st call to ImageUtilities happened in the EDT (seemed not the case when running as a headless NBLS server or as an IDE, but did in the test), UIDefaultsIconMetadata attempted to call back to stil-not-initialized class ImageUtilities that resulted in CDNFE; at least when running locally.

@neilcsmith-net

Copy link
Copy Markdown
Member

Thanks! See, I knew that would cause a bug somewhere, or that fixing it would. 😆

Bit of a backlog in tests with all the branching and merging today. Please merge when it goes green.

@neilcsmith-net
neilcsmith-net merged commit 2b91be1 into apache:deliveryJan 18, 2022
@neilcsmith-netneilcsmith-net removed the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 19, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

API Change[ci] enable extra API related testsenhancementLSP[ci] enable Language Server Protocol testsVSCode Extension

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@sdedic@neilcsmith-net@eirikbakke@jtulach
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Support to redefine icons for LSP client - #3459

Merged
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3
Jan 18, 2022
Merged

Support to redefine icons for LSP client#3459
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3

Conversation

@sdedic

@sdedicsdedic commented Jan 15, 2022

Copy link
Copy Markdown
Member

I reworked the stuff originally in #3414 to a state hopefully acceptable for NB13 before freeze/branching. Overview

Openide changes

  • ImageUtilities just formalize PROPERTY_URL in API + implementation bugfixes

LSP / VSCode changes

  • UIDefaults are patched at startup, with ImageUtilities.loadImages converted to icons for keys that are actually present. Replacement table is in a resource file. Stub image is replicated at build time, and mapped to images not mapped explicitly (just listed).
  • regexps in vscode client adjusted.

@sdedic
sdedic requested review from JaroslavTulach, eirikbakke, entlicher and neilcsmith-net and removed request for entlicherJanuary 15, 2022 11:39
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ea07e73 to ae3badeCompareJanuary 15, 2022 11:42
@sdedicsdedic changed the title Vscode/redefined icons3Support to redefine icons for LSP clientJan 15, 2022
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ae3bade to cfddb16CompareJanuary 15, 2022 12:10

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for splitting out this digestible PR; looks good. I read over everything, though assuming that the LSP stuff was reviewed before by someone more familiar with that part of the codebase.

See in-code comments... main changes requested was fixing a double equals in a properties file and adding a comment to UIDefaultsIconMetadata to make it clear that it doesn't run during normal IDE execution.

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the updates!

@sdedicsdedic self-assigned this Jan 16, 2022
@sdedicsdedic added this to the NB13 milestone Jan 16, 2022
@sdedicsdedic added enhancement LSP [ci] enable Language Server Protocol tests VSCode Extension API Change [ci] enable extra API related tests Need Squashing labels Jan 16, 2022

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you double check the static initialization logic in ImageUtilities. Then please squash and merge when ready. Will be branching for NB13 later today.

Comment threadplatform/openide.util.ui/src/org/openide/util/ImageUtilities.java Outdated
if (EventQueue.isDispatchThread()) {
dummyIconComponent = new JLabel();
dummyIconComponentLabel = new JLabel();
dummyIconComponentButton = new JCheckBox();

@eirikbakkeeirikbakkeJan 17, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're doing a JCheckBox here instead of a JButton, the variable should be called dummyIconComponentCheckBox.

But remind me why we are doing a JCheckBox? I know it extends JButton but unless you know of specific cases that need it, I'd prefer to just have a JButton. Otherwise the hacks start getting too specific, and we'll be afraid to change them in the future.

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

During development of the UIDefaults replacing code, I used ImageUtilities on real icons served by UIManager (default LaF). Several of them had special implementations that downcast the Component to JCheckbox in their paint(). Having a JCheckbox satisfies more icons than just JButton (there are such icons as well) I tried to choose the class that covered most of the errors.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, as long as you saw actual cases, that's fine. What do you mean by "using ImageUtilities"; which method(s) specifically? And which LAF was this? (Which OS?) Why haven't these cases come up before?

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which method(s) specifically

ImageUtilities.icon2Image; that ultimately calls paintIcon() to get the icon rendered to a BufferedImage. OS Linux / KDE, JDK 8+11, default L&F.

Why haven't these cases come up before?

Nobody called icon2Image on those particular UIManager icons ?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the reasoning is captured fine in the comment above too.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it's fine with me. Just wondering if these were problems caused due to aggressive manual testing only, or whether they actually occur during real use.

*/
public static URL findImageBaseURL(Image image) {
Object o = image.getProperty(PROPERTY_URL, null);
return o instanceof URL ? (URL)o : null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space after ")", if you're doing another round of changes...

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, let's get it in before branching.

@neilcsmith-net

neilcsmith-net commented Jan 17, 2022

Copy link
Copy Markdown
Member

@sdedic actually, hold on! Travis CI VSCode test is broken. Lots of logged java.lang.NoClassDefFoundError: Could not initialize class org.openide.util.ImageUtilities.

java.lang.NullPointerException: The image parameter cannot be null
[junit] at org.openide.util.Parameters.notNull(Parameters.java:64)
[junit] at org.openide.util.ImageUtilities.assignToolTipToImageInternal(ImageUtilities.java:397)
[junit] at org.openide.util.ImageUtilities.image2Icon(ImageUtilities.java:328)
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)
[junit] at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:216)
[junit] at javax.swing.UIDefaults.get(UIDefaults.java:161)
...
[junit] at javax.swing.JCheckBox.<init>(JCheckBox.java:174)
...
[junit] Caused: java.lang.ExceptionInInitializerError
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)

Coincidence that that's with JCheckbox, or because of previous fix?

@neilcsmith-net
neilcsmith-net self-requested a review January 17, 2022 15:39
@eirikbakke

Copy link
Copy Markdown
Contributor

@neilcsmith-net ImageUtilities.image2Icon(ImageUtilities.loadImage(resImage)) is suspect in any case, since loadImage can return null and image2Icon does not accept null.

@sdedicsdedic added the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 17, 2022
@neilcsmith-net

Copy link
Copy Markdown
Member

@sdedic I need to proceed with branching. Once available, please rebase this on delivery.

@sdedic

Copy link
Copy Markdown
MemberAuthor

Got it, running tests. Will rebase.

@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from 5791131 to 2fbce60CompareJanuary 17, 2022 17:13
@sdedic
sdedic changed the base branch from master to deliveryJanuary 17, 2022 17:13
@sdedic

Copy link
Copy Markdown
MemberAuthor

Seems that when the 1st call to ImageUtilities happened in the EDT (seemed not the case when running as a headless NBLS server or as an IDE, but did in the test), UIDefaultsIconMetadata attempted to call back to stil-not-initialized class ImageUtilities that resulted in CDNFE; at least when running locally.

@neilcsmith-net

Copy link
Copy Markdown
Member

Thanks! See, I knew that would cause a bug somewhere, or that fixing it would. 😆

Bit of a backlog in tests with all the branching and merging today. Please merge when it goes green.

@neilcsmith-net
neilcsmith-net merged commit 2b91be1 into apache:deliveryJan 18, 2022
@neilcsmith-netneilcsmith-net removed the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 19, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

API Change[ci] enable extra API related testsenhancementLSP[ci] enable Language Server Protocol testsVSCode Extension

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@sdedic@neilcsmith-net@eirikbakke@jtulach
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Support to redefine icons for LSP client - #3459

Merged
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3
Jan 18, 2022
Merged

Support to redefine icons for LSP client#3459
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3

Conversation

@sdedic

@sdedicsdedic commented Jan 15, 2022

Copy link
Copy Markdown
Member

I reworked the stuff originally in #3414 to a state hopefully acceptable for NB13 before freeze/branching. Overview

Openide changes

  • ImageUtilities just formalize PROPERTY_URL in API + implementation bugfixes

LSP / VSCode changes

  • UIDefaults are patched at startup, with ImageUtilities.loadImages converted to icons for keys that are actually present. Replacement table is in a resource file. Stub image is replicated at build time, and mapped to images not mapped explicitly (just listed).
  • regexps in vscode client adjusted.

@sdedic
sdedic requested review from JaroslavTulach, eirikbakke, entlicher and neilcsmith-net and removed request for entlicherJanuary 15, 2022 11:39
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ea07e73 to ae3badeCompareJanuary 15, 2022 11:42
@sdedicsdedic changed the title Vscode/redefined icons3Support to redefine icons for LSP clientJan 15, 2022
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ae3bade to cfddb16CompareJanuary 15, 2022 12:10

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for splitting out this digestible PR; looks good. I read over everything, though assuming that the LSP stuff was reviewed before by someone more familiar with that part of the codebase.

See in-code comments... main changes requested was fixing a double equals in a properties file and adding a comment to UIDefaultsIconMetadata to make it clear that it doesn't run during normal IDE execution.

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the updates!

@sdedicsdedic self-assigned this Jan 16, 2022
@sdedicsdedic added this to the NB13 milestone Jan 16, 2022
@sdedicsdedic added enhancement LSP [ci] enable Language Server Protocol tests VSCode Extension API Change [ci] enable extra API related tests Need Squashing labels Jan 16, 2022

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you double check the static initialization logic in ImageUtilities. Then please squash and merge when ready. Will be branching for NB13 later today.

Comment threadplatform/openide.util.ui/src/org/openide/util/ImageUtilities.java Outdated
if (EventQueue.isDispatchThread()) {
dummyIconComponent = new JLabel();
dummyIconComponentLabel = new JLabel();
dummyIconComponentButton = new JCheckBox();

@eirikbakkeeirikbakkeJan 17, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're doing a JCheckBox here instead of a JButton, the variable should be called dummyIconComponentCheckBox.

But remind me why we are doing a JCheckBox? I know it extends JButton but unless you know of specific cases that need it, I'd prefer to just have a JButton. Otherwise the hacks start getting too specific, and we'll be afraid to change them in the future.

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

During development of the UIDefaults replacing code, I used ImageUtilities on real icons served by UIManager (default LaF). Several of them had special implementations that downcast the Component to JCheckbox in their paint(). Having a JCheckbox satisfies more icons than just JButton (there are such icons as well) I tried to choose the class that covered most of the errors.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, as long as you saw actual cases, that's fine. What do you mean by "using ImageUtilities"; which method(s) specifically? And which LAF was this? (Which OS?) Why haven't these cases come up before?

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which method(s) specifically

ImageUtilities.icon2Image; that ultimately calls paintIcon() to get the icon rendered to a BufferedImage. OS Linux / KDE, JDK 8+11, default L&F.

Why haven't these cases come up before?

Nobody called icon2Image on those particular UIManager icons ?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the reasoning is captured fine in the comment above too.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it's fine with me. Just wondering if these were problems caused due to aggressive manual testing only, or whether they actually occur during real use.

*/
public static URL findImageBaseURL(Image image) {
Object o = image.getProperty(PROPERTY_URL, null);
return o instanceof URL ? (URL)o : null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space after ")", if you're doing another round of changes...

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, let's get it in before branching.

@neilcsmith-net

neilcsmith-net commented Jan 17, 2022

Copy link
Copy Markdown
Member

@sdedic actually, hold on! Travis CI VSCode test is broken. Lots of logged java.lang.NoClassDefFoundError: Could not initialize class org.openide.util.ImageUtilities.

java.lang.NullPointerException: The image parameter cannot be null
[junit] at org.openide.util.Parameters.notNull(Parameters.java:64)
[junit] at org.openide.util.ImageUtilities.assignToolTipToImageInternal(ImageUtilities.java:397)
[junit] at org.openide.util.ImageUtilities.image2Icon(ImageUtilities.java:328)
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)
[junit] at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:216)
[junit] at javax.swing.UIDefaults.get(UIDefaults.java:161)
...
[junit] at javax.swing.JCheckBox.<init>(JCheckBox.java:174)
...
[junit] Caused: java.lang.ExceptionInInitializerError
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)

Coincidence that that's with JCheckbox, or because of previous fix?

@neilcsmith-net
neilcsmith-net self-requested a review January 17, 2022 15:39
@eirikbakke

Copy link
Copy Markdown
Contributor

@neilcsmith-net ImageUtilities.image2Icon(ImageUtilities.loadImage(resImage)) is suspect in any case, since loadImage can return null and image2Icon does not accept null.

@sdedicsdedic added the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 17, 2022
@neilcsmith-net

Copy link
Copy Markdown
Member

@sdedic I need to proceed with branching. Once available, please rebase this on delivery.

@sdedic

Copy link
Copy Markdown
MemberAuthor

Got it, running tests. Will rebase.

@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from 5791131 to 2fbce60CompareJanuary 17, 2022 17:13
@sdedic
sdedic changed the base branch from master to deliveryJanuary 17, 2022 17:13
@sdedic

Copy link
Copy Markdown
MemberAuthor

Seems that when the 1st call to ImageUtilities happened in the EDT (seemed not the case when running as a headless NBLS server or as an IDE, but did in the test), UIDefaultsIconMetadata attempted to call back to stil-not-initialized class ImageUtilities that resulted in CDNFE; at least when running locally.

@neilcsmith-net

Copy link
Copy Markdown
Member

Thanks! See, I knew that would cause a bug somewhere, or that fixing it would. 😆

Bit of a backlog in tests with all the branching and merging today. Please merge when it goes green.

@neilcsmith-net
neilcsmith-net merged commit 2b91be1 into apache:deliveryJan 18, 2022
@neilcsmith-netneilcsmith-net removed the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 19, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

API Change[ci] enable extra API related testsenhancementLSP[ci] enable Language Server Protocol testsVSCode Extension

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@sdedic@neilcsmith-net@eirikbakke@jtulach
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Support to redefine icons for LSP client - #3459

Merged
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3
Jan 18, 2022
Merged

Support to redefine icons for LSP client#3459
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3

Conversation

@sdedic

@sdedicsdedic commented Jan 15, 2022

Copy link
Copy Markdown
Member

I reworked the stuff originally in #3414 to a state hopefully acceptable for NB13 before freeze/branching. Overview

Openide changes

  • ImageUtilities just formalize PROPERTY_URL in API + implementation bugfixes

LSP / VSCode changes

  • UIDefaults are patched at startup, with ImageUtilities.loadImages converted to icons for keys that are actually present. Replacement table is in a resource file. Stub image is replicated at build time, and mapped to images not mapped explicitly (just listed).
  • regexps in vscode client adjusted.

@sdedic
sdedic requested review from JaroslavTulach, eirikbakke, entlicher and neilcsmith-net and removed request for entlicherJanuary 15, 2022 11:39
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ea07e73 to ae3badeCompareJanuary 15, 2022 11:42
@sdedicsdedic changed the title Vscode/redefined icons3Support to redefine icons for LSP clientJan 15, 2022
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ae3bade to cfddb16CompareJanuary 15, 2022 12:10

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for splitting out this digestible PR; looks good. I read over everything, though assuming that the LSP stuff was reviewed before by someone more familiar with that part of the codebase.

See in-code comments... main changes requested was fixing a double equals in a properties file and adding a comment to UIDefaultsIconMetadata to make it clear that it doesn't run during normal IDE execution.

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the updates!

@sdedicsdedic self-assigned this Jan 16, 2022
@sdedicsdedic added this to the NB13 milestone Jan 16, 2022
@sdedicsdedic added enhancement LSP [ci] enable Language Server Protocol tests VSCode Extension API Change [ci] enable extra API related tests Need Squashing labels Jan 16, 2022

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you double check the static initialization logic in ImageUtilities. Then please squash and merge when ready. Will be branching for NB13 later today.

Comment threadplatform/openide.util.ui/src/org/openide/util/ImageUtilities.java Outdated
if (EventQueue.isDispatchThread()) {
dummyIconComponent = new JLabel();
dummyIconComponentLabel = new JLabel();
dummyIconComponentButton = new JCheckBox();

@eirikbakkeeirikbakkeJan 17, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're doing a JCheckBox here instead of a JButton, the variable should be called dummyIconComponentCheckBox.

But remind me why we are doing a JCheckBox? I know it extends JButton but unless you know of specific cases that need it, I'd prefer to just have a JButton. Otherwise the hacks start getting too specific, and we'll be afraid to change them in the future.

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

During development of the UIDefaults replacing code, I used ImageUtilities on real icons served by UIManager (default LaF). Several of them had special implementations that downcast the Component to JCheckbox in their paint(). Having a JCheckbox satisfies more icons than just JButton (there are such icons as well) I tried to choose the class that covered most of the errors.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, as long as you saw actual cases, that's fine. What do you mean by "using ImageUtilities"; which method(s) specifically? And which LAF was this? (Which OS?) Why haven't these cases come up before?

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which method(s) specifically

ImageUtilities.icon2Image; that ultimately calls paintIcon() to get the icon rendered to a BufferedImage. OS Linux / KDE, JDK 8+11, default L&F.

Why haven't these cases come up before?

Nobody called icon2Image on those particular UIManager icons ?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the reasoning is captured fine in the comment above too.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it's fine with me. Just wondering if these were problems caused due to aggressive manual testing only, or whether they actually occur during real use.

*/
public static URL findImageBaseURL(Image image) {
Object o = image.getProperty(PROPERTY_URL, null);
return o instanceof URL ? (URL)o : null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space after ")", if you're doing another round of changes...

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, let's get it in before branching.

@neilcsmith-net

neilcsmith-net commented Jan 17, 2022

Copy link
Copy Markdown
Member

@sdedic actually, hold on! Travis CI VSCode test is broken. Lots of logged java.lang.NoClassDefFoundError: Could not initialize class org.openide.util.ImageUtilities.

java.lang.NullPointerException: The image parameter cannot be null
[junit] at org.openide.util.Parameters.notNull(Parameters.java:64)
[junit] at org.openide.util.ImageUtilities.assignToolTipToImageInternal(ImageUtilities.java:397)
[junit] at org.openide.util.ImageUtilities.image2Icon(ImageUtilities.java:328)
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)
[junit] at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:216)
[junit] at javax.swing.UIDefaults.get(UIDefaults.java:161)
...
[junit] at javax.swing.JCheckBox.<init>(JCheckBox.java:174)
...
[junit] Caused: java.lang.ExceptionInInitializerError
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)

Coincidence that that's with JCheckbox, or because of previous fix?

@neilcsmith-net
neilcsmith-net self-requested a review January 17, 2022 15:39
@eirikbakke

Copy link
Copy Markdown
Contributor

@neilcsmith-net ImageUtilities.image2Icon(ImageUtilities.loadImage(resImage)) is suspect in any case, since loadImage can return null and image2Icon does not accept null.

@sdedicsdedic added the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 17, 2022
@neilcsmith-net

Copy link
Copy Markdown
Member

@sdedic I need to proceed with branching. Once available, please rebase this on delivery.

@sdedic

Copy link
Copy Markdown
MemberAuthor

Got it, running tests. Will rebase.

@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from 5791131 to 2fbce60CompareJanuary 17, 2022 17:13
@sdedic
sdedic changed the base branch from master to deliveryJanuary 17, 2022 17:13
@sdedic

Copy link
Copy Markdown
MemberAuthor

Seems that when the 1st call to ImageUtilities happened in the EDT (seemed not the case when running as a headless NBLS server or as an IDE, but did in the test), UIDefaultsIconMetadata attempted to call back to stil-not-initialized class ImageUtilities that resulted in CDNFE; at least when running locally.

@neilcsmith-net

Copy link
Copy Markdown
Member

Thanks! See, I knew that would cause a bug somewhere, or that fixing it would. 😆

Bit of a backlog in tests with all the branching and merging today. Please merge when it goes green.

@neilcsmith-net
neilcsmith-net merged commit 2b91be1 into apache:deliveryJan 18, 2022
@neilcsmith-netneilcsmith-net removed the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 19, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

API Change[ci] enable extra API related testsenhancementLSP[ci] enable Language Server Protocol testsVSCode Extension

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@sdedic@neilcsmith-net@eirikbakke@jtulach
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Support to redefine icons for LSP client - #3459

Merged
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3
Jan 18, 2022
Merged

Support to redefine icons for LSP client#3459
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3

Conversation

@sdedic

@sdedicsdedic commented Jan 15, 2022

Copy link
Copy Markdown
Member

I reworked the stuff originally in #3414 to a state hopefully acceptable for NB13 before freeze/branching. Overview

Openide changes

  • ImageUtilities just formalize PROPERTY_URL in API + implementation bugfixes

LSP / VSCode changes

  • UIDefaults are patched at startup, with ImageUtilities.loadImages converted to icons for keys that are actually present. Replacement table is in a resource file. Stub image is replicated at build time, and mapped to images not mapped explicitly (just listed).
  • regexps in vscode client adjusted.

@sdedic
sdedic requested review from JaroslavTulach, eirikbakke, entlicher and neilcsmith-net and removed request for entlicherJanuary 15, 2022 11:39
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ea07e73 to ae3badeCompareJanuary 15, 2022 11:42
@sdedicsdedic changed the title Vscode/redefined icons3Support to redefine icons for LSP clientJan 15, 2022
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ae3bade to cfddb16CompareJanuary 15, 2022 12:10

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for splitting out this digestible PR; looks good. I read over everything, though assuming that the LSP stuff was reviewed before by someone more familiar with that part of the codebase.

See in-code comments... main changes requested was fixing a double equals in a properties file and adding a comment to UIDefaultsIconMetadata to make it clear that it doesn't run during normal IDE execution.

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the updates!

@sdedicsdedic self-assigned this Jan 16, 2022
@sdedicsdedic added this to the NB13 milestone Jan 16, 2022
@sdedicsdedic added enhancement LSP [ci] enable Language Server Protocol tests VSCode Extension API Change [ci] enable extra API related tests Need Squashing labels Jan 16, 2022

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you double check the static initialization logic in ImageUtilities. Then please squash and merge when ready. Will be branching for NB13 later today.

Comment threadplatform/openide.util.ui/src/org/openide/util/ImageUtilities.java Outdated
if (EventQueue.isDispatchThread()) {
dummyIconComponent = new JLabel();
dummyIconComponentLabel = new JLabel();
dummyIconComponentButton = new JCheckBox();

@eirikbakkeeirikbakkeJan 17, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're doing a JCheckBox here instead of a JButton, the variable should be called dummyIconComponentCheckBox.

But remind me why we are doing a JCheckBox? I know it extends JButton but unless you know of specific cases that need it, I'd prefer to just have a JButton. Otherwise the hacks start getting too specific, and we'll be afraid to change them in the future.

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

During development of the UIDefaults replacing code, I used ImageUtilities on real icons served by UIManager (default LaF). Several of them had special implementations that downcast the Component to JCheckbox in their paint(). Having a JCheckbox satisfies more icons than just JButton (there are such icons as well) I tried to choose the class that covered most of the errors.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, as long as you saw actual cases, that's fine. What do you mean by "using ImageUtilities"; which method(s) specifically? And which LAF was this? (Which OS?) Why haven't these cases come up before?

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which method(s) specifically

ImageUtilities.icon2Image; that ultimately calls paintIcon() to get the icon rendered to a BufferedImage. OS Linux / KDE, JDK 8+11, default L&F.

Why haven't these cases come up before?

Nobody called icon2Image on those particular UIManager icons ?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the reasoning is captured fine in the comment above too.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it's fine with me. Just wondering if these were problems caused due to aggressive manual testing only, or whether they actually occur during real use.

*/
public static URL findImageBaseURL(Image image) {
Object o = image.getProperty(PROPERTY_URL, null);
return o instanceof URL ? (URL)o : null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space after ")", if you're doing another round of changes...

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, let's get it in before branching.

@neilcsmith-net

neilcsmith-net commented Jan 17, 2022

Copy link
Copy Markdown
Member

@sdedic actually, hold on! Travis CI VSCode test is broken. Lots of logged java.lang.NoClassDefFoundError: Could not initialize class org.openide.util.ImageUtilities.

java.lang.NullPointerException: The image parameter cannot be null
[junit] at org.openide.util.Parameters.notNull(Parameters.java:64)
[junit] at org.openide.util.ImageUtilities.assignToolTipToImageInternal(ImageUtilities.java:397)
[junit] at org.openide.util.ImageUtilities.image2Icon(ImageUtilities.java:328)
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)
[junit] at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:216)
[junit] at javax.swing.UIDefaults.get(UIDefaults.java:161)
...
[junit] at javax.swing.JCheckBox.<init>(JCheckBox.java:174)
...
[junit] Caused: java.lang.ExceptionInInitializerError
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)

Coincidence that that's with JCheckbox, or because of previous fix?

@neilcsmith-net
neilcsmith-net self-requested a review January 17, 2022 15:39
@eirikbakke

Copy link
Copy Markdown
Contributor

@neilcsmith-net ImageUtilities.image2Icon(ImageUtilities.loadImage(resImage)) is suspect in any case, since loadImage can return null and image2Icon does not accept null.

@sdedicsdedic added the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 17, 2022
@neilcsmith-net

Copy link
Copy Markdown
Member

@sdedic I need to proceed with branching. Once available, please rebase this on delivery.

@sdedic

Copy link
Copy Markdown
MemberAuthor

Got it, running tests. Will rebase.

@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from 5791131 to 2fbce60CompareJanuary 17, 2022 17:13
@sdedic
sdedic changed the base branch from master to deliveryJanuary 17, 2022 17:13
@sdedic

Copy link
Copy Markdown
MemberAuthor

Seems that when the 1st call to ImageUtilities happened in the EDT (seemed not the case when running as a headless NBLS server or as an IDE, but did in the test), UIDefaultsIconMetadata attempted to call back to stil-not-initialized class ImageUtilities that resulted in CDNFE; at least when running locally.

@neilcsmith-net

Copy link
Copy Markdown
Member

Thanks! See, I knew that would cause a bug somewhere, or that fixing it would. 😆

Bit of a backlog in tests with all the branching and merging today. Please merge when it goes green.

@neilcsmith-net
neilcsmith-net merged commit 2b91be1 into apache:deliveryJan 18, 2022
@neilcsmith-netneilcsmith-net removed the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 19, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

API Change[ci] enable extra API related testsenhancementLSP[ci] enable Language Server Protocol testsVSCode Extension

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@sdedic@neilcsmith-net@eirikbakke@jtulach
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Support to redefine icons for LSP client - #3459

Merged
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3
Jan 18, 2022
Merged

Support to redefine icons for LSP client#3459
neilcsmith-net merged 6 commits into
apache:deliveryfrom
sdedic:vscode/redefined-icons3

Conversation

@sdedic

@sdedicsdedic commented Jan 15, 2022

Copy link
Copy Markdown
Member

I reworked the stuff originally in #3414 to a state hopefully acceptable for NB13 before freeze/branching. Overview

Openide changes

  • ImageUtilities just formalize PROPERTY_URL in API + implementation bugfixes

LSP / VSCode changes

  • UIDefaults are patched at startup, with ImageUtilities.loadImages converted to icons for keys that are actually present. Replacement table is in a resource file. Stub image is replicated at build time, and mapped to images not mapped explicitly (just listed).
  • regexps in vscode client adjusted.

@sdedic
sdedic requested review from JaroslavTulach, eirikbakke, entlicher and neilcsmith-net and removed request for entlicherJanuary 15, 2022 11:39
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ea07e73 to ae3badeCompareJanuary 15, 2022 11:42
@sdedicsdedic changed the title Vscode/redefined icons3Support to redefine icons for LSP clientJan 15, 2022
@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from ae3bade to cfddb16CompareJanuary 15, 2022 12:10

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for splitting out this digestible PR; looks good. I read over everything, though assuming that the LSP stuff was reviewed before by someone more familiar with that part of the codebase.

See in-code comments... main changes requested was fixing a double equals in a properties file and adding a comment to UIDefaultsIconMetadata to make it clear that it doesn't run during normal IDE execution.

@eirikbakkeeirikbakke left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the updates!

@sdedicsdedic self-assigned this Jan 16, 2022
@sdedicsdedic added this to the NB13 milestone Jan 16, 2022
@sdedicsdedic added enhancement LSP [ci] enable Language Server Protocol tests VSCode Extension API Change [ci] enable extra API related tests Need Squashing labels Jan 16, 2022

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you double check the static initialization logic in ImageUtilities. Then please squash and merge when ready. Will be branching for NB13 later today.

Comment threadplatform/openide.util.ui/src/org/openide/util/ImageUtilities.java Outdated
if (EventQueue.isDispatchThread()) {
dummyIconComponent = new JLabel();
dummyIconComponentLabel = new JLabel();
dummyIconComponentButton = new JCheckBox();

@eirikbakkeeirikbakkeJan 17, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're doing a JCheckBox here instead of a JButton, the variable should be called dummyIconComponentCheckBox.

But remind me why we are doing a JCheckBox? I know it extends JButton but unless you know of specific cases that need it, I'd prefer to just have a JButton. Otherwise the hacks start getting too specific, and we'll be afraid to change them in the future.

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

During development of the UIDefaults replacing code, I used ImageUtilities on real icons served by UIManager (default LaF). Several of them had special implementations that downcast the Component to JCheckbox in their paint(). Having a JCheckbox satisfies more icons than just JButton (there are such icons as well) I tried to choose the class that covered most of the errors.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, as long as you saw actual cases, that's fine. What do you mean by "using ImageUtilities"; which method(s) specifically? And which LAF was this? (Which OS?) Why haven't these cases come up before?

@sdedicsdedicJan 17, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which method(s) specifically

ImageUtilities.icon2Image; that ultimately calls paintIcon() to get the icon rendered to a BufferedImage. OS Linux / KDE, JDK 8+11, default L&F.

Why haven't these cases come up before?

Nobody called icon2Image on those particular UIManager icons ?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the reasoning is captured fine in the comment above too.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it's fine with me. Just wondering if these were problems caused due to aggressive manual testing only, or whether they actually occur during real use.

*/
public static URL findImageBaseURL(Image image) {
Object o = image.getProperty(PROPERTY_URL, null);
return o instanceof URL ? (URL)o : null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space after ")", if you're doing another round of changes...

@neilcsmith-netneilcsmith-net left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, let's get it in before branching.

@neilcsmith-net

neilcsmith-net commented Jan 17, 2022

Copy link
Copy Markdown
Member

@sdedic actually, hold on! Travis CI VSCode test is broken. Lots of logged java.lang.NoClassDefFoundError: Could not initialize class org.openide.util.ImageUtilities.

java.lang.NullPointerException: The image parameter cannot be null
[junit] at org.openide.util.Parameters.notNull(Parameters.java:64)
[junit] at org.openide.util.ImageUtilities.assignToolTipToImageInternal(ImageUtilities.java:397)
[junit] at org.openide.util.ImageUtilities.image2Icon(ImageUtilities.java:328)
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)
[junit] at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:216)
[junit] at javax.swing.UIDefaults.get(UIDefaults.java:161)
...
[junit] at javax.swing.JCheckBox.<init>(JCheckBox.java:174)
...
[junit] Caused: java.lang.ExceptionInInitializerError
[junit] at org.netbeans.modules.nbcode.integration.UIDefaultsIconMetadata$1.createValue(UIDefaultsIconMetadata.java:94)

Coincidence that that's with JCheckbox, or because of previous fix?

@neilcsmith-net
neilcsmith-net self-requested a review January 17, 2022 15:39
@eirikbakke

Copy link
Copy Markdown
Contributor

@neilcsmith-net ImageUtilities.image2Icon(ImageUtilities.loadImage(resImage)) is suspect in any case, since loadImage can return null and image2Icon does not accept null.

@sdedicsdedic added the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 17, 2022
@neilcsmith-net

Copy link
Copy Markdown
Member

@sdedic I need to proceed with branching. Once available, please rebase this on delivery.

@sdedic

Copy link
Copy Markdown
MemberAuthor

Got it, running tests. Will rebase.

@sdedic
sdedicforce-pushed the vscode/redefined-icons3 branch from 5791131 to 2fbce60CompareJanuary 17, 2022 17:13
@sdedic
sdedic changed the base branch from master to deliveryJanuary 17, 2022 17:13
@sdedic

Copy link
Copy Markdown
MemberAuthor

Seems that when the 1st call to ImageUtilities happened in the EDT (seemed not the case when running as a headless NBLS server or as an IDE, but did in the test), UIDefaultsIconMetadata attempted to call back to stil-not-initialized class ImageUtilities that resulted in CDNFE; at least when running locally.

@neilcsmith-net

Copy link
Copy Markdown
Member

Thanks! See, I knew that would cause a bug somewhere, or that fixing it would. 😆

Bit of a backlog in tests with all the branching and merging today. Please merge when it goes green.

@neilcsmith-net
neilcsmith-net merged commit 2b91be1 into apache:deliveryJan 18, 2022
@neilcsmith-netneilcsmith-net removed the do not merge Don't merge this PR, it is not ready or just demonstration purposes. label Jan 19, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

API Change[ci] enable extra API related testsenhancementLSP[ci] enable Language Server Protocol testsVSCode Extension

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@sdedic@neilcsmith-net@eirikbakke@jtulach