# HG changeset patch # Parent 16fe9e2bcd61e93a3d127e46f4a3f3cb3592face diff --git a/editor.bracesmatching/src/org/netbeans/modules/editor/bracesmatching/BraceMatchingSidebarComponent.java b/editor.bracesmatching/src/org/netbeans/modules/editor/bracesmatching/BraceMatchingSidebarComponent.java --- a/editor.bracesmatching/src/org/netbeans/modules/editor/bracesmatching/BraceMatchingSidebarComponent.java +++ b/editor.bracesmatching/src/org/netbeans/modules/editor/bracesmatching/BraceMatchingSidebarComponent.java @@ -58,6 +58,9 @@ import java.awt.event.HierarchyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Hashtable; import java.util.Iterator; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeListener; @@ -79,9 +82,12 @@ import javax.swing.text.Element; import javax.swing.text.JTextComponent; import javax.swing.text.Position; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.StyleConstants; import org.netbeans.api.editor.mimelookup.MimeLookup; import org.netbeans.api.editor.mimelookup.MimePath; import org.netbeans.api.editor.settings.AttributesUtilities; +import org.netbeans.api.editor.settings.EditorStyleConstants; import org.netbeans.api.editor.settings.FontColorNames; import org.netbeans.api.editor.settings.FontColorSettings; import org.netbeans.api.editor.settings.SimpleValueNames; @@ -112,7 +118,7 @@ * @author sdedic */ public class BraceMatchingSidebarComponent extends JComponent implements - MatchListener, FocusListener, ViewHierarchyListener, ChangeListener { + MatchListener, FocusListener, ViewHierarchyListener, ChangeListener, Runnable, LookupListener { private static final int TOOLTIP_CHECK_DELAY = 700; @@ -182,7 +188,6 @@ /** * Prevent listeners from being reclaimed before this Component */ - private LookupListener lookupListenerGC; private PreferenceChangeListener prefListenerGC; private JViewport viewport; @@ -191,8 +196,17 @@ */ private Coloring coloring; + /** + * Background color handled specially, inherit means inherit from + * parent JComponent, not from default Coloring. + */ + private Color backColor; + private static final RequestProcessor RP = new RequestProcessor(BraceMatchingSidebarComponent.class); + private final Lookup.Result colorResult; + + @SuppressWarnings("LeakingThisInConstructor") public BraceMatchingSidebarComponent(JTextComponent editor) { this.editor = editor; this.mimeType = DocumentUtilities.getMimeType(editor); @@ -200,18 +214,9 @@ final Lookup.Result r = MimeLookup.getLookup(org.netbeans.lib.editor.util.swing.DocumentUtilities.getMimeType(editor)).lookupResult( FontColorSettings.class); - lookupListenerGC = new LookupListener() { - @Override - public void resultChanged(LookupEvent ev) { - Iterator fcsIt = r.allInstances().iterator(); - if (fcsIt.hasNext()) { - updateColors(r); - } - } - }; prefListenerGC = new PrefListener(); - - r.addLookupListener(WeakListeners.create(LookupListener.class, lookupListenerGC , r)); + this.colorResult = r; + r.addLookupListener(WeakListeners.create(LookupListener.class, this , r)); prefs.addPreferenceChangeListener(WeakListeners.create(PreferenceChangeListener.class, prefListenerGC, prefs)); loadPreferences(); @@ -226,14 +231,13 @@ if (ui instanceof BaseTextUI) { baseUI = (BaseTextUI)ui; MasterMatcher.get(editor).addMatchListener(this); - updateColors(r); } else { baseUI = null; } setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE)); updatePreferredSize(); } - + private void loadPreferences() { showOutline = prefs.getBoolean(SimpleValueNames.BRACE_SHOW_OUTLINE, true); showToolTip = prefs.getBoolean(SimpleValueNames.BRACE_FIRST_TOOLTIP, true); @@ -265,6 +269,22 @@ }); @Override + public void resultChanged(LookupEvent ev) { + if (!SwingUtilities.isEventDispatchThread()) { + SwingUtilities.invokeLater(this); + } else { + run(); + } + } + + public void run() { + Iterator fcsIt = colorResult.allInstances().iterator(); + if (fcsIt.hasNext()) { + updateColors(fcsIt.next()); + } + } + + @Override public void stateChanged(ChangeEvent e) { scrollUpdater.schedule(TOOLTIP_CHECK_DELAY); } @@ -282,7 +302,6 @@ showToolTip = prefs.getBoolean(SimpleValueNames.BRACE_FIRST_TOOLTIP, true); } } - } private static JEditorPane findEditorPane(JTextComponent editor) { @@ -306,6 +325,7 @@ @Override public void addNotify() { super.addNotify(); + run(); ViewHierarchy.get(editor).addViewHierarchyListener(this); editor.addFocusListener(this); } @@ -318,19 +338,19 @@ } - - private void updateColors(Lookup.Result r) { - Iterator fcsIt = r.allInstances().iterator(); - if (!fcsIt.hasNext()) { - return; + private void updateColors(final FontColorSettings fcs) { + if (getParent() == null) { + return; } - FontColorSettings fcs = fcsIt.next(); - AttributeSet as = fcs.getFontColors(BRACES_COLORING); if (as == null) { as = fcs.getFontColors(FontColorNames.DEFAULT_COLORING); + this.backColor = (Color)as.getAttribute(StyleConstants.ColorConstants.Background); } else { - as = AttributesUtilities.createComposite(as, fcs.getFontColors(FontColorNames.DEFAULT_COLORING)); + this.backColor = (Color)as.getAttribute(StyleConstants.ColorConstants.Background); + as = AttributesUtilities.createComposite( + as, + fcs.getFontColors(FontColorNames.DEFAULT_COLORING)); } this.coloring = Coloring.fromAttributeSet(as); int w = 0; @@ -373,7 +393,12 @@ int[] points; Rectangle clip = getVisibleRect();//g.getClipBounds(); - g.setColor(coloring.getBackColor()); + Color backColor = this.backColor; + if (backColor == null) { + // assume get from parent + backColor = getBackground(); + } + g.setColor(backColor); g.fillRect(clip.x, clip.y, clip.width, clip.height); g.setColor(coloring.getForeColor()); diff --git a/editor.fold.nbui/src/org/netbeans/modules/editor/fold/ui/CodeFoldingSideBar.java b/editor.fold.nbui/src/org/netbeans/modules/editor/fold/ui/CodeFoldingSideBar.java --- a/editor.fold.nbui/src/org/netbeans/modules/editor/fold/ui/CodeFoldingSideBar.java +++ b/editor.fold.nbui/src/org/netbeans/modules/editor/fold/ui/CodeFoldingSideBar.java @@ -79,6 +79,8 @@ import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.JTextComponent; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.StyleConstants; import javax.swing.text.View; import org.netbeans.api.editor.fold.Fold; import org.netbeans.api.editor.fold.FoldHierarchy; @@ -304,6 +306,7 @@ if (o == null) { component.putClientProperty(PROP_SIDEBAR_MARK, this); } + prefsListener.preferenceChange(null); } @@ -336,7 +339,6 @@ prefs = MimeLookup.getLookup(org.netbeans.lib.editor.util.swing.DocumentUtilities.getMimeType(component)).lookup(Preferences.class); prefs.addPreferenceChangeListener(WeakListeners.create(PreferenceChangeListener.class, prefsListener, prefs)); - prefsListener.preferenceChange(null); if (LOG.isLoggable(Level.FINE)) { LOG.log(Level.FINE, "Code folding sidebar initialized for: {0}", doc); @@ -363,10 +365,23 @@ } revalidate(); } + + /** + * Resolves background color. Must be called after getColoring(), satisfied in updateColors. + * @return + */ + private Color resolveBackColor() { + AttributeSet attr = specificAttrs; + Color x = (Color)attr.getAttribute(StyleConstants.ColorConstants.Background); + if (x == null) { + x = getParent().getBackground(); + } + return x; + } private void updateColors() { Coloring c = getColoring(); - this.backColor = c.getBackColor(); + this.backColor = resolveBackColor(); this.foreColor = c.getForeColor(); this.font = c.getFont(); } @@ -1005,7 +1020,7 @@ visibleMarks.clear(); Coloring coloring = getColoring(); - g.setColor(coloring.getBackColor()); + g.setColor(resolveBackColor()); g.fillRect(clip.x, clip.y, clip.width, clip.height); g.setColor(coloring.getForeColor()); @@ -1526,6 +1541,8 @@ } return accessibleContext; } + + private AttributeSet specificAttrs; private Coloring getColoring() { if (attribs == null) { @@ -1537,10 +1554,13 @@ FontColorSettings fcs = fcsLookupResult.allInstances().iterator().next(); AttributeSet attr = fcs.getFontColors(FontColorNames.CODE_FOLDING_BAR_COLORING); + specificAttrs = attr; if (attr == null) { attr = fcs.getFontColors(FontColorNames.DEFAULT_COLORING); } else { - attr = AttributesUtilities.createComposite(attr, fcs.getFontColors(FontColorNames.DEFAULT_COLORING)); + attr = AttributesUtilities.createComposite( + attr, + fcs.getFontColors(FontColorNames.DEFAULT_COLORING)); } attribs = attr; } diff --git a/editor/src/org/netbeans/modules/editor/Bundle.properties b/editor/src/org/netbeans/modules/editor/Bundle.properties --- a/editor/src/org/netbeans/modules/editor/Bundle.properties +++ b/editor/src/org/netbeans/modules/editor/Bundle.properties @@ -190,3 +190,4 @@ trailing-whitespace=Trailing Whitespace readonly-files=Readonly Files mark-occurrences=Mark Occurrences +west-sidebars-color=Editor sidebars background diff --git a/editor/src/org/netbeans/modules/editor/impl/CustomizableSideBar.java b/editor/src/org/netbeans/modules/editor/impl/CustomizableSideBar.java --- a/editor/src/org/netbeans/modules/editor/impl/CustomizableSideBar.java +++ b/editor/src/org/netbeans/modules/editor/impl/CustomizableSideBar.java @@ -47,12 +47,20 @@ import java.util.logging.Level; import org.netbeans.modules.editor.*; import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.WeakHashMap; @@ -61,16 +69,23 @@ import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.SwingUtilities; +import javax.swing.border.LineBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import javax.swing.text.AttributeSet; import javax.swing.text.JTextComponent; +import javax.swing.text.StyleConstants; import org.netbeans.api.editor.mimelookup.MimeLookup; import org.netbeans.api.editor.mimelookup.MimePath; +import org.netbeans.api.editor.settings.AttributesUtilities; +import org.netbeans.api.editor.settings.FontColorNames; +import org.netbeans.api.editor.settings.FontColorSettings; import org.netbeans.editor.WeakEventListenerList; import org.openide.filesystems.FileObject; import org.openide.util.Lookup; import org.openide.util.LookupEvent; import org.openide.util.LookupListener; +import org.openide.util.WeakListeners; /** * Editor Customizable Side Bar. @@ -95,6 +110,8 @@ private static final Map> LR = new WeakHashMap>(5); private static final Map, LookupListener> LL = new WeakHashMap, LookupListener>(5); + private static final String COLOR_WEST_SIDEBARS = "west-sidebars-color"; // NOI18N + private CustomizableSideBar() { } @@ -195,9 +212,11 @@ for(SideBarPosition pos : sideBarsMap.keySet()) { List sideBars = sideBarsMap.get(pos); - JPanel panel = new JPanel(); + JPanel panel = pos.getPosition() == SideBarPosition.WEST ? + new WestSidebarHolder(target) : + new JPanel(); panel.setLayout(new BoxLayout(panel, pos.getAxis())); - + for(JComponent c : sideBars) { panel.add(c); } @@ -211,6 +230,135 @@ } } + /** + * Degenerated "right line border"; displays line at the right only. Pads + * the line with the editor component's background, so the divisor and editor's + * graphics (i.e. brace ruler) are separated. + */ + private final static class WestSidebarHolder extends JPanel implements LookupListener, PropertyChangeListener, Runnable { + /** + * The text editor, whose background will be used as a padding + */ + private final JComponent bkgSource; + + private final Lookup.Result colorResult; + + private Color lineColor; + + private Color textBkColor; + + private int thickness = 1; + + @SuppressWarnings("LeakingThisInConstructor") + public WestSidebarHolder(JTextComponent target) { + this.bkgSource = target; + + String mimeType = NbEditorUtilities.getMimeType(target); + colorResult = MimeLookup.getLookup(mimeType).lookupResult(FontColorSettings.class); + colorResult.addLookupListener(WeakListeners.create(LookupListener.class, this, colorResult)); + bkgSource.addPropertyChangeListener(WeakListeners.propertyChange(this, "background", bkgSource)); + getInsets().set(0, 0, 0, 1); + setOpaque(true); + } + + @Override + public void resultChanged(LookupEvent ev) { + run(); + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getSource() == bkgSource && "background".equals(evt.getPropertyName())) { + run(); + } + } + + @Override + public void run() { + if (!SwingUtilities.isEventDispatchThread()) { + SwingUtilities.invokeLater(this); + return; + } + updateUIConfig(); + } + + public int getThickness() { + return thickness; + } + + @Override + public void addNotify() { + super.addNotify(); + updateUIConfig(); + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + if (lineColor == null) { + return; + } + // paint the border: + paintBorder(this, g, 0, 0, getWidth(), getHeight()); + } + + private void updateUIConfig() { + Iterator it = colorResult.allInstances().iterator(); + if (!it.hasNext()) { + return; + } + FontColorSettings fcs = it.next(); + Color line; + Color back; + + AttributeSet as = fcs.getFontColors(COLOR_WEST_SIDEBARS); + if (as == null) { + // backwards - compatible behaviour: use the line number stuff: + as = fcs.getFontColors(FontColorNames.LINE_NUMBER_COLORING); + back = (Color)as.getAttribute(StyleConstants.Background); + line = null; + } else { + Object o; + back = (Color)as.getAttribute(StyleConstants.Background); + line = (Color)as.getAttribute(StyleConstants.Foreground); + } + textBkColor = bkgSource.getBackground(); + if (back == null) { + back = textBkColor; + } + setBackground(back); + if (line == null || line.equals(back)) { + lineColor = null; + } else { + this.lineColor = line; + } + revalidate(); + } + + @Override + public Insets getInsets() { + Insets s = super.getInsets(); + if (lineColor != null) { + s.right += getThickness() + 1; + } + return s; + } + + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + int thick = getThickness(); + if (thick < 1 || !(g instanceof Graphics2D)) { + return; + } + Graphics2D g2d = (Graphics2D)g.create(); + g2d.setColor(this.lineColor); + int x2 = x + width - ((thick +1) / 2); + g2d.drawLine(x2 - 1, + 0, x2 - 1, y + height - 1); + g2d.setColor(textBkColor); + g2d.drawLine(x2, 0, x2, y + height - 1); + } + } + @SuppressWarnings("deprecation") private static Map> createSideBarsMap(JTextComponent target) { String mimeType = NbEditorUtilities.getMimeType(target); diff --git a/editor/src/org/netbeans/modules/editor/resources/NetBeans-editor.xml b/editor/src/org/netbeans/modules/editor/resources/NetBeans-editor.xml --- a/editor/src/org/netbeans/modules/editor/resources/NetBeans-editor.xml +++ b/editor/src/org/netbeans/modules/editor/resources/NetBeans-editor.xml @@ -66,4 +66,5 @@ + diff --git a/versioning.ui/src/org/netbeans/modules/versioning/ui/diff/DiffSidebar.java b/versioning.ui/src/org/netbeans/modules/versioning/ui/diff/DiffSidebar.java --- a/versioning.ui/src/org/netbeans/modules/versioning/ui/diff/DiffSidebar.java +++ b/versioning.ui/src/org/netbeans/modules/versioning/ui/diff/DiffSidebar.java @@ -152,6 +152,7 @@ private VersioningSystem ownerVersioningSystem; private final LookupListener lookupListenerGC; private Color bgColor = Color.WHITE; + private Lookup.Result colorResult; public DiffSidebar(JTextComponent target, FileObject file) { LOG.log(Level.FINE, "creating DiffSideBar for {0}", file != null ? file.getPath() : null); @@ -160,24 +161,31 @@ this.foldHierarchy = FoldHierarchy.get(target); this.document = (BaseDocument) textComponent.getDocument(); this.markProvider = new DiffMarkProvider(); - final Lookup.Result r = MimeLookup.getLookup(org.netbeans.lib.editor.util.swing.DocumentUtilities.getMimeType(target)).lookupResult(FontColorSettings.class); - lookupListenerGC = new LookupListener() { + colorResult = MimeLookup.getLookup(org.netbeans.lib.editor.util.swing.DocumentUtilities.getMimeType(target)).lookupResult(FontColorSettings.class); + + class LL implements LookupListener, Runnable { @Override public void resultChanged(LookupEvent ev) { - Iterator fcsIt = r.allInstances().iterator(); - if (fcsIt.hasNext()) { - updateColors(r); + if (!EventQueue.isDispatchThread()) { + EventQueue.invokeLater(this); + } else { + updateColors(); } } - }; - r.addLookupListener(WeakListeners.create(LookupListener.class, lookupListenerGC , r)); + + @Override + public void run() { + updateColors(); + } + } + lookupListenerGC = new LL(); + colorResult.addLookupListener(WeakListeners.create(LookupListener.class, lookupListenerGC , colorResult)); bgColor = defaultBackground(); - updateColors(r); setToolTipText(""); // NOI18N refreshDiffTask = DiffSidebarManager.getInstance().createDiffSidebarTask(new RefreshDiffTask()); setMaximumSize(new Dimension(BAR_WIDTH, Integer.MAX_VALUE)); } - + FileObject getFileObject() { return fileObject; } @@ -626,6 +634,7 @@ } }).schedule(0); } + updateColors(); } private void shutdown() { @@ -1276,21 +1285,19 @@ } } - private void updateColors (Lookup.Result r) { - Iterator fcsIt = r.allInstances().iterator(); - if (!fcsIt.hasNext()) { + private void updateColors() { + if (getParent() == null) { return; } - FontColorSettings fcs = fcsIt.next(); - - AttributeSet as = fcs.getFontColors(FontColorNames.DEFAULT_COLORING); + Iterator fcsIt = colorResult.allInstances().iterator(); + if (fcsIt.hasNext()) { + updateColors(fcsIt.next()); + } + } + + private void updateColors (FontColorSettings fcs) { Color oldC = bgColor; - Coloring coloring = as == null ? null : Coloring.fromAttributeSet(as); - Color newC = null; - if (coloring != null) { - newC = coloring.getBackColor(); - } - bgColor = newC == null ? defaultBackground() : newC; + bgColor = getParent().getBackground(); if (!bgColor.equals(oldC)) { EventQueue.invokeLater(new Runnable() {