Made SCL Console font configurable through preferences 77/1077/2
authorTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Wed, 4 Oct 2017 20:10:00 +0000 (23:10 +0300)
committerTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Wed, 4 Oct 2017 20:16:19 +0000 (23:16 +0300)
The implementation is in AbstractCommandChannel so it touches all SCL
console, SCL Script Output console included.

The default font is now Courier New-regular-11 which is one size smaller
than before.

refs #7529

Change-Id: I421c3fc299d37c15ea05aa469b7163d4aec66624

bundles/org.simantics.scl.ui/plugin.xml
bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/console/AbstractCommandConsole.java
bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/console/SCLConsole.java
bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/console/SCLScriptConsoleView.java

index be5735e6e3d826452477320389b9495626ec7538..56473fc29c26177f78888cf2201880000ebcb288 100644 (file)
          </view>
       </perspectiveExtension>
    </extension>
+   <extension
+         point="org.eclipse.ui.themes">
+      <themeElementCategory
+            id="org.simantics.scl"
+            label="SCL">
+      </themeElementCategory>
+      <fontDefinition
+            categoryId="org.simantics.scl"
+            id="org.simantics.scl.consolefont"
+            label="SCL Console Font"
+            value="Courier New-regular-11">
+         <description>
+            The SCL Console font is used by SCL Console and SCL Script Output console views.
+         </description>
+      </fontDefinition>
+   </extension>
 
 </plugin>
index a98d65715c7fa89a652ac6a0293667027bfda51a..a293eaee1008c97ddda906211c2be6a240e0d130 100644 (file)
@@ -12,8 +12,11 @@ import org.eclipse.core.runtime.preferences.InstanceScope;
 import org.eclipse.jface.preference.IPersistentPreferenceStore;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.resource.FontDescriptor;
+import org.eclipse.jface.resource.FontRegistry;
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.jface.window.DefaultToolTip;
 import org.eclipse.jface.window.ToolTip;
 import org.eclipse.swt.SWT;
@@ -23,6 +26,7 @@ import org.eclipse.swt.events.VerifyEvent;
 import org.eclipse.swt.events.VerifyListener;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.RGB;
@@ -36,6 +40,7 @@ import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Sash;
+import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.preferences.ScopedPreferenceStore;
 import org.simantics.scl.runtime.tuple.Tuple2;
 
@@ -63,6 +68,7 @@ public abstract class AbstractCommandConsole extends Composite {
 
     StyledText output;
     Sash sash;
+    StyledText deco;
     protected StyledText input;
     
     int userInputHeight=0;
@@ -70,7 +76,10 @@ public abstract class AbstractCommandConsole extends Composite {
     
     protected Color greenColor;
     protected Color redColor;
-    protected Font textFont;
+
+    FontRegistry fontRegistry;
+    FontDescriptor textFontDescriptor;
+    Font textFont;
 
     ArrayList<String> commandHistory = new ArrayList<String>();
     int commandHistoryPos = 0;
@@ -97,7 +106,7 @@ public abstract class AbstractCommandConsole extends Composite {
         return true;
     }
 
-    private boolean hasOption(int mask) {
+    protected boolean hasOption(int mask) {
         return (options & mask) != 0;
     }
 
@@ -105,7 +114,12 @@ public abstract class AbstractCommandConsole extends Composite {
         resourceManager = new LocalResourceManager(JFaceResources.getResources(), this);
         greenColor = resourceManager.createColor(new RGB(0, 128, 0));
         redColor = resourceManager.createColor(new RGB(172, 0, 0));
-        textFont = resourceManager.createFont( FontDescriptor.createFrom("Courier New", 12, SWT.NONE) );
+
+        // Initialize current text font
+        fontRegistry = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getFontRegistry();
+        fontRegistry.addListener(fontRegistryListener);
+        FontDescriptor font = FontDescriptor.createFrom( fontRegistry.getFontData("org.simantics.scl.consolefont") );
+        setTextFont(font);
 
         setLayout(new FormLayout());
 
@@ -152,6 +166,8 @@ public abstract class AbstractCommandConsole extends Composite {
         readPreferences();
 
         addListener(SWT.Dispose, event -> {
+            if (fontRegistry != null)
+                fontRegistry.removeListener(fontRegistryListener);
             try {
                 writePreferences();
             } catch (IOException e) {
@@ -161,8 +177,7 @@ public abstract class AbstractCommandConsole extends Composite {
     }
 
     protected void createInputArea() {
-        // "> " Decoration
-        StyledText deco = new StyledText(this, SWT.MULTI | SWT.READ_ONLY);
+        deco = new StyledText(this, SWT.MULTI | SWT.READ_ONLY);
         deco.setFont(textFont);
         deco.setEnabled(false);
         GC gc = new GC(deco);
@@ -513,15 +528,12 @@ public abstract class AbstractCommandConsole extends Composite {
     private void asyncSetErrorAnnotations(final String forCommand, final ErrorAnnotation[] annotations) {
         if(input.isDisposed())
             return;
-        input.getDisplay().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                if(input.isDisposed())
-                    return;
-                if(!input.getText().equals(forCommand))
-                    return;
-                syncSetErrorAnnotations(forCommand, annotations);
-            }
+        input.getDisplay().asyncExec(() -> {
+            if(input.isDisposed())
+                return;
+            if(!input.getText().equals(forCommand))
+                return;
+            syncSetErrorAnnotations(forCommand, annotations);
         });
     }
     
@@ -562,4 +574,33 @@ public abstract class AbstractCommandConsole extends Composite {
         return output;
     }
 
+    IPropertyChangeListener fontRegistryListener = new IPropertyChangeListener() {
+        @Override
+        public void propertyChange(PropertyChangeEvent event) {
+            setTextFont( FontDescriptor.createFrom((FontData[]) event.getNewValue()) );
+        }
+    };
+
+    private void setTextFont(FontDescriptor font) {
+        FontDescriptor oldFontDesc = textFontDescriptor;
+        textFont = resourceManager.createFont(font);
+        textFontDescriptor = font;
+        applyTextFont(textFont);
+
+        // Only destroy old font after the new font has been set!
+        if (oldFontDesc != null)
+            resourceManager.destroyFont(oldFontDesc);
+    }
+
+    private void applyTextFont(Font font) {
+        if (output != null)
+            output.setFont(font);
+        if (deco != null)
+            deco.setFont(font);
+        if (input != null) {
+            input.setFont(font);
+            adjustInputSize(input.getText());
+        }
+    }
+
 }
index dcb56cc3a72d7d29354efd6544fc11af7ff8dcd0..9207bef3946529c51e587907540faa91e146b453 100644 (file)
@@ -33,6 +33,13 @@ import gnu.trove.set.hash.THashSet;
  * @author Hannu Niemist&ouml;
  */
 public class SCLConsole extends AbstractCommandConsole {
+
+    /**
+     * Use this option mask to exclude {@link SCLConsoleListener}s contributed as
+     * OSGi services from listening to this console.
+     */
+    public static final int EXCLUDE_CONTRIBUTED_LISTENERS = 1 << 10;
+
        public static final String JOB_NAME = "org.simantics.scl.console.job";
        public static final long TERMINATE_GRACE_PERIOD = 1000L;
        
@@ -66,7 +73,8 @@ public class SCLConsole extends AbstractCommandConsole {
     public SCLConsole(Composite parent, int style, int options) {
         super(parent, style, options);
         createContentProposalAdapter();
-        addContributedListeners();
+        if (!hasOption(EXCLUDE_CONTRIBUTED_LISTENERS))
+            addContributedListeners();
     }
 
     protected void createContentProposalAdapter() {
index 8df0caa36a4a70da262e12c22d15131394fdad60..3bcd1c61bcf4ec74f7d79c0fe949b57f6fce797b 100644 (file)
@@ -14,21 +14,12 @@ import org.simantics.scl.runtime.reporting.SCLReportingHandler;
  */
 public class SCLScriptConsoleView extends ViewPart {
 
-    static class SCLOutputConsole extends SCLConsole {
-        public SCLOutputConsole(Composite parent, int style) {
-            super(parent, style, AbstractCommandConsole.HIDE_INPUT);
-        }
-
-        @Override
-        protected void addContributedListeners() {
-        }
-    }
-
-    SCLOutputConsole console;
+    private SCLConsole console;
 
     @Override
     public void createPartControl(Composite parent) {
-        this.console = new SCLOutputConsole(parent, SWT.NONE);
+        this.console = new SCLConsole(parent, SWT.NONE,
+                AbstractCommandConsole.HIDE_INPUT | SCLConsole.EXCLUDE_CONTRIBUTED_LISTENERS);
 
         IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
         Action interruptAction = ConsoleActions.createInterruptAction(console);