From b3804e6f0ea4d5d90d3c7064d52ea51743bcdc67 Mon Sep 17 00:00:00 2001
From: Dmitry Trofimov <dmitry.trofimov@jetbrains.com>
Date: Thu, 9 Aug 2018 12:27:46 +0200
Subject: [PATCH] Improve UI: grayscale icons, better text

---
 .../com/jetbrains/professional/Docker.png     | Bin 206 -> 168 bytes
 .../com/jetbrains/professional/Docker@2x.png  | Bin 385 -> 303 bytes
 .../jetbrains/professional/DockerCompose.png  | Bin 214 -> 211 bytes
 .../professional/DockerCompose@2x.png         | Bin 395 -> 311 bytes
 .../com/jetbrains/professional/vagrant.png    | Bin 102 -> 93 bytes
 .../com/jetbrains/professional/vagrant@2x.png | Bin 145 -> 125 bytes
 .../professional/vagrant@2x_dark.png          | Bin 143 -> 125 bytes
 .../jetbrains/professional/vagrant_dark.png   | Bin 102 -> 93 bytes
 .../sdk/add/PyAddProfessionalSdkInfo.kt       |  70 +++++++++---------
 9 files changed, 33 insertions(+), 37 deletions(-)

diff --git a/python/resources/icons/com/jetbrains/professional/Docker.png b/python/resources/icons/com/jetbrains/professional/Docker.png
index c2896dc7c7f3dd28e567c3e5df8ea50594eab79a..6118d5eea9d491d36028d62a0240e0df30415c3b 100644
GIT binary patch
delta 151
zcmV;I0BHZt0jL3x8Gi%-006c6H|hWY0B=b|K~#9!V_={kX#Nj_bW+fKzPTU20uZaA
z*#Nhb-y>Ov(2EA&Hz%MdnDzew5W}S#FpRtKzYM4Zu3G@EpnQJo|JMJj|4;jW17Sh{
zvV#P!z5fpc2NA|6pu1V&*!mkl<1hT5^uKvM9?xL|08USpI1o(!@?HP{002ovPDHLk
FV1l^OLlXc1

delta 189
zcmV;u07Cz$0nP!C8Gi-<001BJ|6u?C0F_BZK~#9!V_+D5fOF29|LAxa831IT2jYH8
z41kF>0I>l%0sJ1T*Ra`20D}xlz-fT_`VapPJ^KZwv1o1}=(NSRe*AZ7SOhi%i_HQU
z25|IUpYJ+p&wmgu*>>x{`Kp)yH$C`?%>@Ct0!Lu&y`S&@LpDLnxo_B<o<Jys75XoI
rTMx1s<aCfXG*-L=X<ScMlo1O68p#RH2mF<X00000NkvXXu0mjf4GmFL

diff --git a/python/resources/icons/com/jetbrains/professional/Docker@2x.png b/python/resources/icons/com/jetbrains/professional/Docker@2x.png
index b959f10c6901b520aea9e4c66dda71a355645f8a..4f4ab0fb10e1ed04c7f0bc55aa64ab783236452e 100644
GIT binary patch
delta 287
zcmV+)0pR|D1Fr&*8Gi%-007x@vVQ;o0QN~lK~#9!V_+BsgAg?T$AqH>3?>7b4S>7^
zN(@*J<~xvY0EB;@QUm@s_czaPE@&1YJ(a#kG59^nMgVO_Hef$OVn0#vJc{=FNcLm%
zHy(H&XjlV^^RX$L1%x;ZP#_}YFZ>6A3)r-;#}+vEQ58)BYJblD9|9z25o15lfcfao
z2N{r!&432%(c@74zXS|3|3~5T!hW1FT)96FXk*#`p8v=G@BCj6_6COS=kX+*W`mvo
z5nvYf$TPs7$`TI34fqap1qrspjR;us{sG*O4?sgE!P0yKv1whPxnSD)mH!U{;m-ey
l{&&9zmH-K4<QO`-0sxN)IF)|SBvSwY002ovPDHLkV1lsYef9tV

delta 369
zcmV-%0gnE!0)YdN8Gi-<0047(dh`GQ0Z2(iK~#9!V_+BsqhJ&e0GxB){3iyFI$+cR
zqYl8L&j2cyFi;Lyk0kFf5Dq|=KR?h80O5Who)5$YKrBFy67)SD2fwGeBcMLU<$(Rz
zH0-A$K99%p`&fNXY+RFx??WBdfHUZcHOzed2QVhl0SZ(}?SG4J{rC?9AU2VfuO~Lq
z+{b5-#)@}fi%rUA{TEH_2D6C_2?b&uFrQG+!yEv@L^_~>lx*X`Ir;v7j_ylv%wD_i
zKU>Zca-(2B$$6J!!tMPgRSUsBbZJ=hKY8k={~J%;_+NVb%YV)pPvKEPgwM~DRnUNH
zFpy=~00}7{lxmg?C@H}bTF!mLaKMM3{~#ej3!h_gM1c3UkM9pX`-S0<2cQ3f9Ri99
zw6eW{+GV)_sOHjN{r-H|?oa<gp#s7n%iXtr{4crq?R#jQpFo$|ZP)?;&cN(W7JO;2
P00000NkvXXu0mjfq{*wo

diff --git a/python/resources/icons/com/jetbrains/professional/DockerCompose.png b/python/resources/icons/com/jetbrains/professional/DockerCompose.png
index 9f51b9a569e31ff6608cd4ebb9e19d59c9d77b1b..7059df701aba62ed29a2a58e7de19264d5060c89 100644
GIT binary patch
delta 194
zcmV;z06qWK0n-7H8Gi%-006c6H|hWY0GdfeK~#9!V_+Z_H2()dnkpd5ew?OYDri36
z+>c)Yh}F<+fZNjdNY+7^Sm68S1QZ3c{yzX>xO4-OaZUe0@cjQWpc1%l0hl~v*?f@D
z%KuaTU;jT7rXT>}9;RI3OYeXG|NVdO|3)ALnFX~Q3RoCeb30Y{ZM^vZ*8emA`~Np=
ws5N3>L{`AYz`?-9zzu|4Ko%QN12eJ$0A`+;E-lId&;S4c07*qoM6N<$f;f&@>i_@%

delta 197
zcmV;$06PEE0oDPK8Gi-<001BJ|6u?C0G&xhK~#9!V_={*;GFa3KMW611E}VAl3hZK
z0YLV7AnvEc0GL<<5F3!=&G%TnhAc=V1{suq(*X1JAO0VD_6tm7(cD1LX^U_D`0vuN
z2y6%zn*}fo;OM(P-*wWS{~%nl?bd(uRWJW<dhipQ3j%Njjy}NJdq3a*hk}-K->^A7
zflvr5^k4e69%M7f=^$@ttat~~xSp&iBNhMv(IXD-Sm%Dc00000NkvXXu0mjfJy2O&

diff --git a/python/resources/icons/com/jetbrains/professional/DockerCompose@2x.png b/python/resources/icons/com/jetbrains/professional/DockerCompose@2x.png
index 71c154b4b724325411b5049a689e180e039fbae6..9e645d76c86200093f15a14c7a9f937c75f7e39d 100644
GIT binary patch
delta 295
zcmV+?0oeYF1GfT@8Gi%-007x@vVQ;o0RBltK~#9!V_+C`p!q)njv6pf1`M9~C)q1>
zF`(H1$V;Hafc0R$1NjC(_~$7#;D2*}^Ze$5W&zS;>OHctKpv?^0BuG#U_U})KT+^J
ziuU_R_M=D;hWCMnHJ~^jo3dFzh{FH{yfFZQ7yg651#H^aV}A>r`>2X00X1j;4*`<1
zh_N4Nz<hM)gAB;VW<Ue>=y9n2Ujl}i|D*7EVL#3ouH2sow6W}e&;MipcmA&jdjrGv
z^LP?Yv%${)2rvtK<Qd>kWeEr227Cv)f&|;)Mg%N*{{U{t2cRL7U}?UA*t9OtTrlnY
t%Kry}aOeL;{~){H151DeGIAYV0RTuzM5UnZO?ChP002ovPDHLkV1lWAhu#1H

delta 379
zcmV->0fhdy0*eEX8Gi-<0047(dh`GQ0a8gsK~#9!V_+Bs1OVrpH~+EWQ3s4VVB|Pp
zG~c5KInASF*f;<vW&o8-7$^s<N0N6K2nQg`pC4!kfN(z$&j;cHAQqrUZhDW)u~0by
zT05X0j|28&)3Be4_&grV?_>2n9u3sM_n{7Jz!~(!8fL!!1AiEk=l}(>Q$I3ZeCx-5
z7yz+}w0u3WiRL~&gEUsW16yoTHtWA=VmFvgWJo9w>wx)$f*$4o5GK+A4Wwin2hPd&
z|8sO-f@AjDegD~VmXI3-`$^8b920KuH>p|(_MuC|qW{TLH~rsu>c;=l<6r)B&Ugxs
z3L<=do~(ifRCI%ZEW-v!Nco_&WI#y?me6wU8-@cu{QL(A30n9Ziz5QOw|#tn=-Dp}
zhdlWF7wiyFRG^jZ4b(2n1wb{I{_6MV!*+lA4+<3!23hXD_2YlZ#c$t3>-+?|)NaET
Z0039G0Nn*j+Q|R_002ovPDHLkV1oIzsx|-s

diff --git a/python/resources/icons/com/jetbrains/professional/vagrant.png b/python/resources/icons/com/jetbrains/professional/vagrant.png
index 92438d4683d76fc1539a75c44d154f3610de9a35..9122344021f7713bb415b571ea302bade50e8089 100644
GIT binary patch
delta 73
zcmYd`ognGL!oa|=^_Tf8Af@8z;uunKD>*^J<iO&Ck9pKo6nd8^yyH=mG2@c@pq;TG
bOof4g?QYA<_o<orK=llsu6{1-oD!M<fPxsC

delta 82
zcmaz|n;_}S#=yWJ|M`C+kka*ZaSW-rm7E~Ks^M@TKbToyz9L)j63Nw!i%$MOFVO7H
lE8)Us5|HF@_<`3yhQ~3#GGC>hZUt&&@O1TaS?83{1OQlO9QXhL

diff --git a/python/resources/icons/com/jetbrains/professional/vagrant@2x.png b/python/resources/icons/com/jetbrains/professional/vagrant@2x.png
index ac84dff5477adffcdd4dd1376cbfaa17e53ba8a3..14c1847a2858f78a424e13f66910fc6fe834d2ec 100644
GIT binary patch
delta 106
zcmV-w0G0od0ez4eWCQ>J0NHc0e*gdgL`g(JRCwC$)Ugo&FbD!b$8(Cz!hjByI)(zz
z7O44>2*>%7$kMu;Q(!VDz-&%{Q(6reFz^7_0U&QM06^bJ2H@lGxnheE&$aaVlK=n!
M07*qoM6N<$g0FKcNB{r;

delta 126
zcmb=O$T&f=f{lTJp}4B*3y_NNba4!+xb^nhLS6<10TxHE0~f@6FPymQBKw6UgT?Y7
z`{vnm{!N@OBzSRY%<gZ;PS@JzF)!+iZaDE+Y{3@GI6j~eKw!b}i*v$PZWhLrdM8GP
ck9RJuWqthf$v%mjMOh$ePgg&ebxsLQ02d`OcK`qY

diff --git a/python/resources/icons/com/jetbrains/professional/vagrant@2x_dark.png b/python/resources/icons/com/jetbrains/professional/vagrant@2x_dark.png
index 99e25e800751f396cb1501338fabc09abf182378..9f7e23f312e7b8d0e8f8ee4afc42b96b1564102c 100644
GIT binary patch
delta 106
zcmeBYteqg4!otA7aI<(*J&<zoba4!+xb^nRMnMJx4km~8(jF0>7Xd4iH9q7t&eHEJ
zn4{mRv-Y$lt6DMBnP)5(ORqLCGV?dcGJIlVX86*Z!eIAr9=EEhdwqkcvkTBX22WQ%
Jmvv4FO#sAKBya!#

delta 124
zcmb>JXPh8e#>T+FP+V2@1xST?x;TbZ+<JR$Auodhk4s=!B8ymZn{m$dxeUDu>KO+A
z)tCQH@m5sY6;hp{ANTHcq4b2(J4`8Z+Zl4tR9FHH0D=b$FVr2b=}%yp@Rw7S;YhLf
ZcCq)%Vpncfx*-md_H^}gS?83{1OTflEQtUB

diff --git a/python/resources/icons/com/jetbrains/professional/vagrant_dark.png b/python/resources/icons/com/jetbrains/professional/vagrant_dark.png
index f0477cf121bd82e35963b936097490820787a7be..8a1ccad500e2ed5356a744950e38069db1f7542f 100644
GIT binary patch
delta 73
zcmYd`ognGL!oa|=^_Tf8Af@8z;uunKD>*^JL}97oQyw)Hh2A9#p7E&3m~lyc(9T#8
brozBruy#^mSIC9cK=llsu6{1-oD!M<Q}q{=

delta 82
zcmaz|n;_}S#=yWJ|M`C+kka*ZaSW-rm7E~Ks^MVx-iKLWz9L)j63Nw!ZEOFZ7if0p
lm2hD*2}p7{{J`rUgPyL$uelSaECgy~@O1TaS?83{1OP7#8#w>~

diff --git a/python/src/com/jetbrains/python/sdk/add/PyAddProfessionalSdkInfo.kt b/python/src/com/jetbrains/python/sdk/add/PyAddProfessionalSdkInfo.kt
index cbf2a8a77fec..8b33b1418cb8 100644
--- a/python/src/com/jetbrains/python/sdk/add/PyAddProfessionalSdkInfo.kt
+++ b/python/src/com/jetbrains/python/sdk/add/PyAddProfessionalSdkInfo.kt
@@ -11,17 +11,14 @@ import com.intellij.openapi.projectRoots.Sdk
 import com.intellij.openapi.ui.Splitter
 import com.intellij.openapi.ui.ValidationInfo
 import com.intellij.openapi.util.registry.Registry
-import com.intellij.ui.components.JBLabel
+import com.intellij.ui.HyperlinkLabel
 import com.intellij.ui.components.JBList
-import com.intellij.ui.components.labels.SwingActionLink
-import com.intellij.ui.components.panels.HorizontalLayout
 import com.intellij.ui.components.panels.VerticalLayout
 import com.intellij.util.ui.JBUI
 import java.awt.Component
-import java.awt.event.ActionEvent
-import javax.swing.*
-
-const val PROFESSIONAL = "(Professional)"
+import javax.swing.Icon
+import javax.swing.JPanel
+import javax.swing.JTextArea
 
 abstract class PyAddSdkInfoProvider : PyAddSdkProvider {
   override fun createView(project: Project?,
@@ -31,7 +28,7 @@ abstract class PyAddSdkInfoProvider : PyAddSdkProvider {
     if (Registry.`is`("python.show.professional.interpreter.types")) {
       val panel = createPanel()
 
-      panel.panelName = panel.panelName + " " + PROFESSIONAL
+      panel.panelName = panel.panelName
       panel
     }
     else null
@@ -40,23 +37,23 @@ abstract class PyAddSdkInfoProvider : PyAddSdkProvider {
 }
 
 class PyAddDockerSdkInfoProvider : PyAddSdkInfoProvider() {
-  override fun createPanel() = PyAddProfessionalSdkInfoPanel("Docker", ProfessionalIcons.Docker, "using-docker-as-a-remote-interpreter.html")
+  override fun createPanel() = PyAddProfessionalSdkInfoPanel("Docker", ProfessionalIcons.Docker, "using-docker-as-a-remote-interpreter.html", "Are you developing your code using a Docker image? With PyCharm Professional Edition you can use a Docker container with the same ease of use as a virtualenv: run and debug code with a click of a button.")
 }
 
 
 class PyAddDockerComposeSdkInfoProvider : PyAddSdkInfoProvider() {
-  override fun createPanel() = PyAddProfessionalSdkInfoPanel("Docker Compose", ProfessionalIcons.DockerCompose, "using-docker-compose-as-a-remote-interpreter.html")
+  override fun createPanel() = PyAddProfessionalSdkInfoPanel("Docker Compose", ProfessionalIcons.DockerCompose, "using-docker-compose-as-a-remote-interpreter.html", "With Docker Compose you get a reproducible environment not only for your code, but also for backing services like a database. PyCharm Professional integrates seamlessly to give you the run and debug experience you鈥檙e used to from local development with containers.")
 }
 
 class PyAddSshSdkInfoProvider : PyAddSdkInfoProvider() {
-  override fun createPanel() = PyAddProfessionalSdkInfoPanel("SSH Interpreter", ProfessionalIcons.SSH, "configuring-remote-interpreters-via-ssh.html")
+  override fun createPanel() = PyAddProfessionalSdkInfoPanel("SSH Interpreter", ProfessionalIcons.SSH, "configuring-remote-interpreters-via-ssh.html", "Would you like to run and debug code on a remote machine? If you have SSH access to a machine, PyCharm Professional Edition is able to synchronize your code, and debug it remotely with the same ease-of-use you get locally.")
 }
 
 class PyAddVagrantSdkInfoProvider : PyAddSdkInfoProvider() {
-  override fun createPanel() = PyAddProfessionalSdkInfoPanel("Vagrant", ProfessionalIcons.Vagrant, "configuring-remote-interpreters-via-virtual-boxes.html")
+  override fun createPanel() = PyAddProfessionalSdkInfoPanel("Vagrant", ProfessionalIcons.Vagrant, "configuring-remote-interpreters-via-virtual-boxes.html", "Vagrant allows you to provision VMs for a consistent and reproducible development environment. PyCharm Professional Edition can shorten your development loop by connecting to the Python interpreter within your VM. Run and Debug your code straight from PyCharm.")
 }
 
-class PyAddProfessionalSdkInfoPanel(override var panelName: String, override val icon: Icon, val helpPage: String) : JPanel(), PyAddSdkView {
+class PyAddProfessionalSdkInfoPanel(override var panelName: String, override val icon: Icon, val helpPage: String, val text: String) : JPanel(), PyAddSdkView {
   override fun getOrCreateSdk(): Sdk? = null
 
 
@@ -87,43 +84,42 @@ class PyAddProfessionalSdkInfoPanel(override var panelName: String, override val
 
   init {
     layout = VerticalLayout(JBUI.scale(10))
-    val panel = JPanel(HorizontalLayout(JBUI.scale(0)))
-    panel.add(HorizontalLayout.LEFT,
-              JBLabel("Support for ${this.panelName} is available in "))
-    panel.add(HorizontalLayout.LEFT, SwingActionLink(object : AbstractAction("PyCharm Professional Edition") {
-      override fun actionPerformed(e: ActionEvent?) {
-        val info = ApplicationInfo.getInstance()
-        val productVersion = info.majorVersion + "." + info.minorVersionMainPart
-        BrowserUtil.browse("https://www.jetbrains.com/pycharm/features/editions_comparison_matrix.html?utm_source=product&utm_medium=link&utm_campaign=PC_INTERPRETER&utm_content=$productVersion")
-      }
-    }))
-    add(VerticalLayout.TOP, panel)
-
-    val panel2 = JPanel(HorizontalLayout(JBUI.scale(0)))
-    panel2.add(HorizontalLayout.LEFT,
-              JBLabel("Read more about ${this.panelName} in "))
-    panel2.add(HorizontalLayout.LEFT, SwingActionLink(object : AbstractAction(" PyCharm help") {
-      override fun actionPerformed(e: ActionEvent?) {
+
+    val textArea = JTextArea(this.text, 3,80)
+    textArea.isEditable = false
+    textArea.lineWrap = true
+    textArea.isOpaque = false
+    textArea.wrapStyleWord = true
+    add(VerticalLayout.TOP, textArea)
+
+    add(VerticalLayout.TOP, HyperlinkLabel("Try PyCharm Professional Edition").apply {  addHyperlinkListener {
+      val info = ApplicationInfo.getInstance()
+      val productVersion = info.majorVersion + "." + info.minorVersionMainPart
+      BrowserUtil.browse("https://www.jetbrains.com/pycharm/features/editions_comparison_matrix.html?utm_source=product&utm_medium=link&utm_campaign=PC_INTERPRETER&utm_content=$productVersion")
+    }})
+
+
+    add(VerticalLayout.TOP, HyperlinkLabel("Read more about ${this.panelName} support in PyCharm help").apply {
+      addHyperlinkListener {
         BrowserUtil.browse("https://www.jetbrains.com/help/pycharm/$helpPage")
       }
-    }))
-    add(VerticalLayout.TOP, panel2)
+    })
 
-    add(VerticalLayout.TOP, SwingActionLink(object : AbstractAction("Got it! Don't show features of Professional Edition here") {
-      override fun actionPerformed(e: ActionEvent?) {
+    add(VerticalLayout.TOP, HyperlinkLabel("Got it! Don't show features of Professional Edition here").apply {
+      addHyperlinkListener {
         Registry.get("python.show.professional.interpreter.types").setValue(false)
         val list = (this@PyAddProfessionalSdkInfoPanel.parent.parent as Splitter).firstComponent as JBList<*>
         var newList = Lists.newArrayList<PyAddSdkView>()
         for (i in 0 until list.itemsCount) {
           val elementAt = list.model.getElementAt(i)
-          if (!(elementAt as PyAddSdkView).panelName.endsWith(PROFESSIONAL)) {
-            newList.add(elementAt)
+          if (!(elementAt is PyAddProfessionalSdkInfoPanel)) {
+            newList.add(elementAt as PyAddSdkView)
           }
         }
         list.model = JBList.createDefaultListModel(newList)
 
         list.selectedIndex = 0
       }
-    }))
+    })
   }
 }
-- 
GitLab