From 91ac9974bfdfedf709ed7bd726691a454df897c9 Mon Sep 17 00:00:00 2001 From: Valentina Kiryushkina Date: Fri, 5 Feb 2016 16:00:25 +0300 Subject: [PATCH] Fix code highlighting in study task description for darcula laf --- .../code-mirror/codemirror-darcula.css | 365 ++++++++++++++++++ .../code-mirror/codemirror-old-darcula.css | 147 +++++++ .../resources/code-mirror/codemirror.css | 6 + .../resources/style/javaFXBrowserDarcula.css | 15 +- .../edu/learning/ui/StudyBrowserWindow.java | 31 +- 5 files changed, 552 insertions(+), 12 deletions(-) create mode 100644 python/educational-core/student/resources/code-mirror/codemirror-darcula.css create mode 100644 python/educational-core/student/resources/code-mirror/codemirror-old-darcula.css diff --git a/python/educational-core/student/resources/code-mirror/codemirror-darcula.css b/python/educational-core/student/resources/code-mirror/codemirror-darcula.css new file mode 100644 index 000000000000..3467a40553d2 --- /dev/null +++ b/python/educational-core/student/resources/code-mirror/codemirror-darcula.css @@ -0,0 +1,365 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +body { + margin-left: 20px; + /*font-family: Serif, serif;*/ + font-family: monospace; + font-weight: lighter; +} + +/* BASICS */ +.task-help pre code { + background-color: #f7f7f7; + white-space: pre-wrap; + margin-bottom: 10px; + padding: 5px 25px 5px 15px; + display: inline-block; + margin-right: 21px; +} + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; + white-space: nowrap; +} +.CodeMirror-linenumbers {} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0; + background: #7e7; +} +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} + +.cm-animate-fat-cursor { + width: auto; + border: 0; + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; + background-color: #7e7; +} +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ +.CodeMirror-overwrite .CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-ruler { + border-left: 1px solid #ccc; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: #589df6;} +.cm-s-default .cm-quote {color: #6a864c;} +.cm-negative {color: #d44;} +.cm-positive {color: #6a864c;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-link {text-decoration: underline;} +.cm-strikethrough {text-decoration: line-through;} + +.cm-s-default .cm-keyword {color: #708;} +.cm-s-default .cm-atom {color: #219;} +.cm-s-default .cm-number {color: #164;} +.cm-s-default .cm-def {color: #589df6;} +.cm-s-default .cm-variable, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3 {color: #085;} +.cm-s-default .cm-comment {color: #a50;} +.cm-s-default .cm-string {color: #a11;} +.cm-s-default .cm-string-2 {color: #f50;} +.cm-s-default .cm-meta {color: #555;} +.cm-s-default .cm-qualifier {color: #555;} +.cm-s-default .cm-builtin {color: #30a;} +.cm-s-default .cm-bracket {color: #997;} +.cm-s-default .cm-tag {color: #170;} +.cm-s-default .cm-attribute {color: #589df6;} +.cm-s-default .cm-hr {color: #999;} +.cm-s-default .cm-link {color: #589df6;} + +.cm-s-default .cm-error {color: #f00;} +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 30px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -30px; margin-right: -30px; + padding-bottom: 30px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; +} +.CodeMirror-sizer { + position: relative; + border-right: 30px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actuall scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + margin-bottom: -30px; + /* Hack to make IE7 behave */ + *zoom:1; + *display:inline; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; +} +.CodeMirror-wrap pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + overflow: auto; +} + +.CodeMirror-widget {} + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { position: absolute; } +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background: #ffa; + background: rgba(255, 255, 0, .4); +} + +/* IE7 hack to prevent it from returning funny offsetTops on the spans */ +.CodeMirror span { *vertical-align: text-bottom; } + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } \ No newline at end of file diff --git a/python/educational-core/student/resources/code-mirror/codemirror-old-darcula.css b/python/educational-core/student/resources/code-mirror/codemirror-old-darcula.css new file mode 100644 index 000000000000..ba9d6b1ffa7e --- /dev/null +++ b/python/educational-core/student/resources/code-mirror/codemirror-old-darcula.css @@ -0,0 +1,147 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.cm-s-default span.cm-keyword { + color: #b07732; + font-weight: bold; +} + +.cm-s-default span.cm-softKeyword { + color: #b07732; + font-weight: bold; +} + +.cm-s-default span.cm-atom { + color: #b07732; + font-weight: bold; +} + +.cm-s-default span.cm-number { + color: #b07732; +} + +.cm-s-default span.cm-string { + color: #588652; + font-weight: bold; +} + +.cm-s-default span.cm-def { + color: #dddddd; +} + +.cm-s-default span.cm-variable { + color: #dddddd; +} + +.cm-s-default span.cm-variable-2 { + color: #b07732; +} + +.cm-s-default span.cm-variable-3 { + color: #dddddd; +} + +.cm-s-default span.cm-property { + color: #dddddd; +} + +.cm-s-default span.cm-operator { + color: #dddddd; +} + +.cm-s-default span.cm-comment { + color: #7f7f7f; +} + +.cm-s-default span.cm-string-2 { + color: #f50; +} + +.cm-s-default span.cm-meta { + color: #ba9d2a; +} + +.cm-s-default span.cm-error { + color: #944b5e; +} + +.cm-s-default span.cm-qualifier { + color: #555; +} + +.cm-s-default span.cm-builtin { + color: #30a; +} + +.cm-s-default span.cm-bracket { + color: #cc7; +} + +.cm-s-default span.cm-tag { + color: #ba9d2a; +} + +.cm-s-default span.cm-attribute { + color: #589df6; +} + +.cm-s-default span.cm-header { + color: #a0a; +} + +.cm-s-default span.cm-quote { + color: #6a7846; +} + +.cm-s-default span.cm-hr { + color: #999; +} + +.cm-s-default span.cm-link { + color: #589df6; +} + +span.cm-header, span.cm-strong { + font-weight: bold; +} + +span.cm-em { + font-style: italic; +} + +span.cm-emstrong { + font-style: italic; + font-weight: bold; +} + +span.cm-link { + text-decoration: underline; +} + +div.CodeMirror span.CodeMirror-matchingbracket { + /*color: #0000ff;*/ + /*border: 1px #0000ff solid;*/ + /*background-color: #FFE87C;*/ + background-color: #e4e4ff; +} + +div.CodeMirror span.CodeMirror-nonmatchingbracket { + color: #b76b5e; +} + +span.bullet { + padding-right: 5px; +} \ No newline at end of file diff --git a/python/educational-core/student/resources/code-mirror/codemirror.css b/python/educational-core/student/resources/code-mirror/codemirror.css index 6dbeb5ba9e91..464ad6715e5c 100644 --- a/python/educational-core/student/resources/code-mirror/codemirror.css +++ b/python/educational-core/student/resources/code-mirror/codemirror.css @@ -1,3 +1,9 @@ +body { + margin-left: 20px; + /*font-family: Serif, serif;*/ + font-family: monospace; + font-weight: lighter; +} /* BASICS */ .task-help pre code { background-color: #f7f7f7; diff --git a/python/educational-core/student/resources/style/javaFXBrowserDarcula.css b/python/educational-core/student/resources/style/javaFXBrowserDarcula.css index 391cdd6e6d6d..31b15dec07bd 100644 --- a/python/educational-core/student/resources/style/javaFXBrowserDarcula.css +++ b/python/educational-core/student/resources/style/javaFXBrowserDarcula.css @@ -4,21 +4,20 @@ background-color: #3c3f41; body { background-color: #3c3f41; - font-size: 12pt; - font-family: Serif; - font-weight: normal; - margin-left: 0; - margin-right: 0; - color: #dddddd + color: #bababa } p img { - background-color: #bbbbbb; + background-color: #bababa; } textarea { background-color: #3c3f41; -color: #dddddd +color: #bababa +} + +a { + color: #589df6 } tr { diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyBrowserWindow.java b/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyBrowserWindow.java index 87fd5974d817..f5237293261f 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyBrowserWindow.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyBrowserWindow.java @@ -82,6 +82,7 @@ class StudyBrowserWindow extends JFrame { myPane.getStylesheets().add(scrollBarStyleUrl.toExternalForm()); myPane.setStyle("-fx-background-color: #3c3f41"); myPanel.getScene().getStylesheets().add(engineStyleUrl.toExternalForm()); + myEngine.reload(); }); } @@ -154,15 +155,37 @@ class StudyBrowserWindow extends JFrame { } template = template.replace("${highlight_mode}", getClass().getResource("/code-mirror/clike.js").toExternalForm()); + template = template.replace("${codemirror}", getClass().getResource("/code-mirror/codemirror.js").toExternalForm()); template = template.replace("${python}", getClass().getResource("/code-mirror/python.js").toExternalForm()); template = template.replace("${runmode}", getClass().getResource("/code-mirror/runmode.js").toExternalForm()); template = template.replace("${colorize}", getClass().getResource("/code-mirror/colorize.js").toExternalForm()); - template = template.replace("${codemirror}", getClass().getResource("/code-mirror/codemirror.js").toExternalForm()); template = template.replace("${javascript}", getClass().getResource("/code-mirror/javascript.js").toExternalForm()); - template = template.replace("${css_codemirror}", getClass().getResource("/code-mirror/codemirror.css").toExternalForm()); - template = template.replace("${css_oldcodemirror}", getClass().getResource("/code-mirror/codemirror-old.css").toExternalForm()); + if (LafManager.getInstance().getCurrentLookAndFeel() instanceof DarculaLookAndFeelInfo) { + template = template.replace("${css_oldcodemirror}", getClass().getResource("/code-mirror/codemirror-old-darcula.css").toExternalForm()); + template = template.replace("${css_codemirror}", getClass().getResource("/code-mirror/codemirror-darcula.css").toExternalForm()); + } + else { + template = template.replace("${css_oldcodemirror}", getClass().getResource("/code-mirror/codemirror-old.css").toExternalForm()); + template = template.replace("${css_codemirror}", getClass().getResource("/code-mirror/codemirror.css").toExternalForm()); + } template = template.replace("${default-mode}", configurator.getDefaultHighlightingMode()); - template = template.replace("${code}", content); + template = template.replace("${code}", "

Nullable types

\n" + + "

Read about null safety and safe calls in Kotlin and rewrite the following Java code using only one if expression:

public void sendMessageToClient(\n" +
+                                           "    @Nullable Client client,\n" +
+                                           "    @Nullable String message,\n" +
+                                           "    @NotNull Mailer mailer\n" +
+                                           ") {\n" +
+                                           "    if (client == null || message == null) return;\n" +
+                                           "\n" +
+                                           "    PersonalInfo personalInfo = client.getPersonalInfo();\n" +
+                                           "    if (personalInfo == null) return;\n" +
+                                           "\n" +
+                                           "    String email = personalInfo.getEmail();\n" +
+                                           "    if (email == null) return;\n" +
+                                           "\n" +
+                                           "    mailer.sendMessage(email, message);\n" +
+                                           "}\n" +
+                                           "
"); return template; }