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;
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;
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;
+import org.slf4j.Logger;
/**
* A console with input and output area that can be embedded
*/
public static final int HIDE_INPUT = 1 << 0;
- public static final String PLUGIN_ID = "org.simantics.scl.ui";
+ public static final String PLUGIN_ID = "org.simantics.scl.ui"; //$NON-NLS-1$
public static final int COMMAND_HISTORY_SIZE = 50;
StyledText output;
Sash sash;
+ StyledText deco;
protected StyledText input;
int userInputHeight=0;
protected Color greenColor;
protected Color redColor;
- protected Font textFont;
+
+ FontRegistry fontRegistry;
+ FontDescriptor textFontDescriptor;
+ Font textFont;
ArrayList<String> commandHistory = new ArrayList<String>();
int commandHistoryPos = 0;
return true;
}
- private boolean hasOption(int mask) {
+ protected boolean hasOption(int mask) {
return (options & mask) != 0;
}
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") ); //$NON-NLS-1$
+ setTextFont(font);
setLayout(new FormLayout());
readPreferences();
addListener(SWT.Dispose, event -> {
+ if (fontRegistry != null)
+ fontRegistry.removeListener(fontRegistryListener);
try {
writePreferences();
} catch (IOException e) {
}
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);
int inputLeftPos = gc.getFontMetrics().getAverageCharWidth()*2;
gc.dispose();
- deco.setText(">");
+ deco.setText(">"); //$NON-NLS-1$
deco.setLayoutData( formData(sash, 100, 0, new Tuple2(0, inputLeftPos)) );
// Input area
input = new StyledText(this, SWT.MULTI);
input.setFont(textFont);
input.setLayoutData( formData(sash, 100, new Tuple2(0, inputLeftPos), 100) );
- adjustInputSize("");
+ adjustInputSize(""); //$NON-NLS-1$
input.addVerifyKeyListener(event -> {
switch(event.keyCode) {
case SWT.KEYPAD_CR:
}
});
input.addVerifyListener(e -> {
- if(e.text.contains("\n")) {
+ if(e.text.contains("\n")) { //$NON-NLS-1$
int lineId = input.getLineAtOffset(e.start);
int lineOffset = input.getOffsetAtLine(lineId);
int indentAmount;
for(indentAmount=0;
lineOffset+indentAmount < input.getCharCount() &&
- input.getTextRange(lineOffset+indentAmount, 1).equals(" ");
+ input.getTextRange(lineOffset+indentAmount, 1).equals(" "); //$NON-NLS-1$
++indentAmount);
StringBuilder indent = new StringBuilder();
indent.append('\n');
for(int i=0;i<indentAmount;++i)
indent.append(' ');
- e.text = e.text.replace("\n", indent);
+ e.text = e.text.replace("\n", indent); //$NON-NLS-1$
}
});
input.addModifyListener(e -> {
Tuple2 t = (Tuple2) o;
return new FormAttachment((Integer) t.c0, (Integer) t.c1);
}
- throw new IllegalArgumentException("argument not supported: " + o);
+ throw new IllegalArgumentException("argument not supported: " + o); //$NON-NLS-1$
}
private int getOffsetInInput(int x, int y) {
String validatedText;
- Job validationJob = new Job("SCL input validation") {
+ Job validationJob = new Job("SCL input validation") { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
};
- Job preValidationJob = new Job("SCL input validation") {
+ Job preValidationJob = new Job("SCL input validation") { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
if(!input.isDisposed()) {
// Print it into output area
//appendOutput("> " + command.replace("\n", "\n ") + "\n", greenColor, null);
- input.setText("");
+ input.setText(""); //$NON-NLS-1$
// Execute
execute(command);
range.start = 0;
range.length = 1;
input.setStyleRange(range);
- System.err.println("The following error message didn't have a proper location:");
- System.err.println(annotation.description);
+ getLogger().error("The following error message didn't have a proper location: {}", annotation.description, e); //$NON-NLS-1$
}
}
}
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);
});
}
public void clear() {
outputModiLock = true;
- output.setText("");
+ output.setText(""); //$NON-NLS-1$
outputModiLock = false;
}
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());
+ }
+ }
+
+ public abstract Logger getLogger();
}