From 328c8fc97374f24230aa63ecf6130755eea5d499 Mon Sep 17 00:00:00 2001 From: Danila Ponomarenko Date: Fri, 8 Jun 2012 15:01:34 +0400 Subject: [PATCH 1/9] tests fixed --- .../GenerateConstructorHandler.java | 19 ++++++++++++++++--- .../generation/GenerateMembersUtil.java | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java index 46f7dd9da417..52adb3b8c657 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java @@ -248,7 +248,7 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase { PsiParameter[] parms = baseConstructor.getParameterList().getParameters(); for (PsiParameter parm : parms) { PsiParameter newParam = factory.createParameter(parm.getName(), parm.getType()); - copyModifierList(parm, newParam); + replaceModifierList(parm, newParam); constructor.getParameterList().add(newParam); } } @@ -291,11 +291,24 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase { return constructor; } - static void copyModifierList(PsiParameter parm, PsiParameter newParam) { + static void copyModifierList(JVMElementFactory factory, PsiParameter parm, PsiParameter newParam) { PsiModifierList modifierList = parm.getModifierList(); PsiModifierList newMList = newParam.getModifierList(); if (modifierList != null && newMList != null) { - newMList.replace(modifierList); + for (PsiAnnotation annotation : modifierList.getAnnotations()) { + newMList.add(factory.createAnnotationFromText(annotation.getText(), newParam)); + } + for (@PsiModifier.ModifierConstant String m : PsiModifier.MODIFIERS) { + newMList.setModifierProperty(m, parm.hasModifierProperty(m)); + } + } + } + + static void replaceModifierList(PsiParameter sourceParam, PsiParameter targetParam) { + PsiModifierList sourceModifierList = sourceParam.getModifierList(); + PsiModifierList targetModifierList = targetParam.getModifierList(); + if (sourceModifierList != null && targetModifierList != null) { + targetModifierList.replace(sourceModifierList); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java index 2bd69a3ac2f7..4a9c4df3fb1d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -303,7 +303,7 @@ public class GenerateMembersUtil { } } else { - GenerateConstructorHandler.copyModifierList(parameter, newParameter); + GenerateConstructorHandler.copyModifierList(factory,parameter, newParameter); } newMethod.getParameterList().add(newParameter); } From 6c66f6347293a11b0456e6e55283600ab26eb498 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Fri, 8 Jun 2012 15:02:12 +0400 Subject: [PATCH 2/9] Moving module type icons in place --- .../intellij/openapi/module/JavaModuleType.java | 2 +- .../types/JavaeeAppModule.png} | Bin .../types/ejbModule.png} | Bin .../modules/{ => types}/emptyProjectType.png | Bin .../src/modules/{ => types}/javaModule.png | Bin .../src/modules/{ => types}/pluginModule.png | Bin .../types/webModule.png} | Bin .../openapi/module/EmptyModuleType.java | 2 +- .../openapi/module/WebModuleTypeBase.java | 2 +- .../util/src/com/intellij/icons/AllIcons.java | 16 ++++++++++------ plugins/devkit/src/module/PluginModuleType.java | 2 +- .../griffon/GriffonToolWindowFactory.java | 12 ++++++------ .../idea/maven/wizards/MavenModuleBuilder.java | 2 +- 13 files changed, 21 insertions(+), 17 deletions(-) rename platform/icons/src/{javaee/JavaeeAppModuleBig.png => modules/types/JavaeeAppModule.png} (100%) rename platform/icons/src/{javaee/ejbModuleBig.png => modules/types/ejbModule.png} (100%) rename platform/icons/src/modules/{ => types}/emptyProjectType.png (100%) rename platform/icons/src/modules/{ => types}/javaModule.png (100%) rename platform/icons/src/modules/{ => types}/pluginModule.png (100%) rename platform/icons/src/{javaee/webModuleBig.png => modules/types/webModule.png} (100%) diff --git a/java/java-impl/src/com/intellij/openapi/module/JavaModuleType.java b/java/java-impl/src/com/intellij/openapi/module/JavaModuleType.java index e2a0a92fc422..051743e72187 100644 --- a/java/java-impl/src/com/intellij/openapi/module/JavaModuleType.java +++ b/java/java-impl/src/com/intellij/openapi/module/JavaModuleType.java @@ -92,7 +92,7 @@ public class JavaModuleType extends ModuleType { } private static class IconHolder { - private static final Icon JAVA_MODULE_ICON = AllIcons.Modules.JavaModule; + private static final Icon JAVA_MODULE_ICON = AllIcons.Modules.Types.JavaModule; } private static Icon getJavaModuleIcon() { diff --git a/platform/icons/src/javaee/JavaeeAppModuleBig.png b/platform/icons/src/modules/types/JavaeeAppModule.png similarity index 100% rename from platform/icons/src/javaee/JavaeeAppModuleBig.png rename to platform/icons/src/modules/types/JavaeeAppModule.png diff --git a/platform/icons/src/javaee/ejbModuleBig.png b/platform/icons/src/modules/types/ejbModule.png similarity index 100% rename from platform/icons/src/javaee/ejbModuleBig.png rename to platform/icons/src/modules/types/ejbModule.png diff --git a/platform/icons/src/modules/emptyProjectType.png b/platform/icons/src/modules/types/emptyProjectType.png similarity index 100% rename from platform/icons/src/modules/emptyProjectType.png rename to platform/icons/src/modules/types/emptyProjectType.png diff --git a/platform/icons/src/modules/javaModule.png b/platform/icons/src/modules/types/javaModule.png similarity index 100% rename from platform/icons/src/modules/javaModule.png rename to platform/icons/src/modules/types/javaModule.png diff --git a/platform/icons/src/modules/pluginModule.png b/platform/icons/src/modules/types/pluginModule.png similarity index 100% rename from platform/icons/src/modules/pluginModule.png rename to platform/icons/src/modules/types/pluginModule.png diff --git a/platform/icons/src/javaee/webModuleBig.png b/platform/icons/src/modules/types/webModule.png similarity index 100% rename from platform/icons/src/javaee/webModuleBig.png rename to platform/icons/src/modules/types/webModule.png diff --git a/platform/lang-impl/src/com/intellij/openapi/module/EmptyModuleType.java b/platform/lang-impl/src/com/intellij/openapi/module/EmptyModuleType.java index 8d9e51455985..d7571adffad4 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/EmptyModuleType.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/EmptyModuleType.java @@ -23,7 +23,7 @@ import org.jetbrains.annotations.NonNls; import javax.swing.*; public class EmptyModuleType extends ModuleType { - private static final Icon ICON = AllIcons.Modules.EmptyProjectType; + private static final Icon ICON = AllIcons.Modules.Types.EmptyProjectType; @NonNls public static final String EMPTY_MODULE = "EMPTY_MODULE"; //private static final EmptyModuleType ourInstance = new EmptyModuleType(); diff --git a/platform/lang-impl/src/com/intellij/openapi/module/WebModuleTypeBase.java b/platform/lang-impl/src/com/intellij/openapi/module/WebModuleTypeBase.java index 00c61edf05d4..b3e7326b3e34 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/WebModuleTypeBase.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/WebModuleTypeBase.java @@ -28,7 +28,7 @@ import javax.swing.*; public abstract class WebModuleTypeBase extends ModuleType { @NonNls public static final String WEB_MODULE = "WEB_MODULE"; - private static final Icon MODULE_ICON = AllIcons.Javaee.WebModuleBig; + private static final Icon MODULE_ICON = AllIcons.Modules.Types.WebModule; private static final Icon MODULE_NODE_ICON_OPEN = AllIcons.Nodes.ModuleOpen; private static final Icon MODULE_NODE_ICON_CLOSED = AllIcons.Nodes.ModuleClosed; diff --git a/platform/util/src/com/intellij/icons/AllIcons.java b/platform/util/src/com/intellij/icons/AllIcons.java index e6c7ed291beb..ddde83a671bb 100644 --- a/platform/util/src/com/intellij/icons/AllIcons.java +++ b/platform/util/src/com/intellij/icons/AllIcons.java @@ -629,7 +629,6 @@ public class AllIcons { public static final Icon Ejb_jar_xml = IconLoader.getIcon("/javaee/ejb-jar_xml.png"); public static final Icon EjbClass = IconLoader.getIcon("/javaee/ejbClass.png"); public static final Icon EjbModule = IconLoader.getIcon("/javaee/ejbModule.png"); - public static final Icon EjbModuleBig = IconLoader.getIcon("/javaee/ejbModuleBig.png"); public static final Icon EmbeddedAttributeOverlay = IconLoader.getIcon("/javaee/embeddedAttributeOverlay.png"); public static final Icon EntityBean = IconLoader.getIcon("/javaee/entityBean.png"); public static final Icon EntityBeanBig = IconLoader.getIcon("/javaee/entityBeanBig.png"); @@ -638,7 +637,6 @@ public class AllIcons { public static final Icon InterceptorClass = IconLoader.getIcon("/javaee/interceptorClass.png"); public static final Icon InterceptorMethod = IconLoader.getIcon("/javaee/interceptorMethod.png"); public static final Icon JavaeeAppModule = IconLoader.getIcon("/javaee/JavaeeAppModule.png"); - public static final Icon JavaeeAppModuleBig = IconLoader.getIcon("/javaee/JavaeeAppModuleBig.png"); public static final Icon JpaFacet = IconLoader.getIcon("/javaee/jpaFacet.png"); public static final Icon Local = IconLoader.getIcon("/javaee/local.png"); public static final Icon LocalHome = IconLoader.getIcon("/javaee/localHome.png"); @@ -659,7 +657,6 @@ public class AllIcons { public static final Icon UpdateRunningApplication = IconLoader.getIcon("/javaee/updateRunningApplication.png"); public static final Icon Web_xml = IconLoader.getIcon("/javaee/web_xml.png"); public static final Icon WebModule = IconLoader.getIcon("/javaee/webModule.png"); - public static final Icon WebModuleBig = IconLoader.getIcon("/javaee/webModuleBig.png"); public static final Icon WebModuleGroup = IconLoader.getIcon("/javaee/webModuleGroup.png"); public static final Icon WebService = IconLoader.getIcon("/javaee/WebService.png"); public static final Icon WebServiceClient = IconLoader.getIcon("/javaee/WebServiceClient.png"); @@ -681,16 +678,13 @@ public class AllIcons { public static final Icon DeleteContentFolderRollover = IconLoader.getIcon("/modules/deleteContentFolderRollover.png"); public static final Icon DeleteContentRoot = IconLoader.getIcon("/modules/deleteContentRoot.png"); public static final Icon DeleteContentRootRollover = IconLoader.getIcon("/modules/deleteContentRootRollover.png"); - public static final Icon EmptyProjectType = IconLoader.getIcon("/modules/emptyProjectType.png"); public static final Icon ExcludeFolder = IconLoader.getIcon("/modules/excludeFolder.png"); public static final Icon ExcludeRootClosed = IconLoader.getIcon("/modules/excludeRootClosed.png"); public static final Icon ExcludeRootOpened = IconLoader.getIcon("/modules/excludeRootOpened.png"); - public static final Icon JavaModule = IconLoader.getIcon("/modules/javaModule.png"); public static final Icon Library = IconLoader.getIcon("/modules/library.png"); public static final Icon Merge = IconLoader.getIcon("/modules/merge.png"); public static final Icon ModulesNode = IconLoader.getIcon("/modules/modulesNode.png"); public static final Icon Output = IconLoader.getIcon("/modules/output.png"); - public static final Icon PluginModule = IconLoader.getIcon("/modules/pluginModule.png"); public static final Icon SetPackagePrefix = IconLoader.getIcon("/modules/setPackagePrefix.png"); public static final Icon SetPackagePrefixRollover = IconLoader.getIcon("/modules/setPackagePrefixRollover.png"); public static final Icon SourceClosed = IconLoader.getIcon("/modules/sourceClosed.png"); @@ -703,6 +697,16 @@ public class AllIcons { public static final Icon TestRootOpened = IconLoader.getIcon("/modules/testRootOpened.png"); public static final Icon TestSourceClosed = IconLoader.getIcon("/modules/testSourceClosed.png"); public static final Icon TestSourceOpened = IconLoader.getIcon("/modules/testSourceOpened.png"); + + public static class Types { + public static final Icon EjbModule = IconLoader.getIcon("/modules/types/ejbModule.png"); + public static final Icon EmptyProjectType = IconLoader.getIcon("/modules/types/emptyProjectType.png"); + public static final Icon JavaeeAppModule = IconLoader.getIcon("/modules/types/JavaeeAppModule.png"); + public static final Icon JavaModule = IconLoader.getIcon("/modules/types/javaModule.png"); + public static final Icon PluginModule = IconLoader.getIcon("/modules/types/pluginModule.png"); + public static final Icon WebModule = IconLoader.getIcon("/modules/types/webModule.png"); + + } public static final Icon UnmarkWebroot = IconLoader.getIcon("/modules/unmarkWebroot.png"); public static final Icon WebRoot = IconLoader.getIcon("/modules/webRoot.png"); diff --git a/plugins/devkit/src/module/PluginModuleType.java b/plugins/devkit/src/module/PluginModuleType.java index a6099efd6a63..1bc310988075 100644 --- a/plugins/devkit/src/module/PluginModuleType.java +++ b/plugins/devkit/src/module/PluginModuleType.java @@ -48,7 +48,7 @@ import java.util.List; import java.util.Set; public class PluginModuleType extends ModuleType { - private static final Icon PLUGIN_MODULE_ICON = AllIcons.Modules.PluginModule; + private static final Icon PLUGIN_MODULE_ICON = AllIcons.Modules.Types.PluginModule; private static final Icon PLUGIN_MODULE_NODE_ICON = AllIcons.Nodes.Plugin; private static final Icon ADD_PLUGIN_MODULE_ICON = IconLoader.getIcon("/add_plugin_modulewizard.png"); @NonNls private static final String ID = "PLUGIN_MODULE"; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/griffon/GriffonToolWindowFactory.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/griffon/GriffonToolWindowFactory.java index 707a4ebeeb2e..92e594dccb29 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/griffon/GriffonToolWindowFactory.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/griffon/GriffonToolWindowFactory.java @@ -26,7 +26,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; -import com.intellij.util.Icons; +import com.intellij.util.PlatformIcons; import com.intellij.util.containers.hash.LinkedHashMap; import org.jetbrains.plugins.groovy.GroovyIcons; import org.jetbrains.plugins.groovy.mvc.projectView.*; @@ -75,17 +75,17 @@ public class GriffonToolWindowFactory extends MvcToolWindowDescriptor { final PsiDirectory testsUnit = findDirectory(project, root, "test/unit"); if (testsUnit != null) { result.add( - new TestsTopLevelDirectoryNode(module, testsUnit, viewSettings, "Unit Tests", Icons.TEST_SOURCE_FOLDER, Icons.TEST_SOURCE_FOLDER)); + new TestsTopLevelDirectoryNode(module, testsUnit, viewSettings, "Unit Tests", PlatformIcons.TEST_SOURCE_FOLDER, PlatformIcons.TEST_SOURCE_FOLDER)); } final PsiDirectory testsIntegration = findDirectory(project, root, "test/integration"); if (testsIntegration != null) { - result.add(new TestsTopLevelDirectoryNode(module, testsIntegration, viewSettings, "Integration Tests", Icons.TEST_SOURCE_FOLDER, - Icons.TEST_SOURCE_FOLDER)); + result.add(new TestsTopLevelDirectoryNode(module, testsIntegration, viewSettings, "Integration Tests", PlatformIcons.TEST_SOURCE_FOLDER, + PlatformIcons.TEST_SOURCE_FOLDER)); } final PsiDirectory testsShared = findDirectory(project, root, "test/shared"); if (testsShared != null) { - result.add(new TestsTopLevelDirectoryNode(module, testsShared, viewSettings, "Shared Test Sources", Icons.TEST_SOURCE_FOLDER, - Icons.TEST_SOURCE_FOLDER)); + result.add(new TestsTopLevelDirectoryNode(module, testsShared, viewSettings, "Shared Test Sources", PlatformIcons.TEST_SOURCE_FOLDER, + PlatformIcons.TEST_SOURCE_FOLDER)); } // add additional sources provided by plugins diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java index 1cca2564225f..96b31a81b7c2 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java @@ -44,7 +44,7 @@ import java.util.List; import java.util.Map; public class MavenModuleBuilder extends ModuleBuilder implements SourcePathsBuilder { - private static final Icon BIG_ICON = AllIcons.Modules.JavaModule; + private static final Icon BIG_ICON = AllIcons.Modules.Types.JavaModule; private MavenProject myAggregatorProject; private MavenProject myParentProject; From 684308423882ef2966a87af195ed4278c23e484c Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Fri, 8 Jun 2012 15:27:17 +0400 Subject: [PATCH 3/9] Moving module type icons in place --- platform/icons/src/javaee/messageBeanBig.png | Bin 1286 -> 0 bytes platform/icons/src/javaee/sessionBeanBig.png | Bin 1190 -> 0 bytes .../util/src/com/intellij/icons/AllIcons.java | 2 -- 3 files changed, 2 deletions(-) delete mode 100644 platform/icons/src/javaee/messageBeanBig.png delete mode 100644 platform/icons/src/javaee/sessionBeanBig.png diff --git a/platform/icons/src/javaee/messageBeanBig.png b/platform/icons/src/javaee/messageBeanBig.png deleted file mode 100644 index ae6155cb8f383dd70f199ff15f3c9e55a55acd03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1286 zcmV+h1^N1kP)d%)dsP~RULK}`H_6`r@$vt~)BnKH|5$CH+S>o{@c;Pw|NQ*_hfWI2 z;Q!9y|HIP%_V)f{XJ%J#snFs7%F6$UNC#PNp~BPuhgunUJp^lTZO^DW(3Bx;eX7x> zI?=F7(x*IZeyM4M$!jYDyv_f;jUm2=BEFF%zLhb)&;P#B|G$A4d_M($MFzr@CBl^^ zfLa~H!~cUn1%pWkZ#4pMHUq_&F~!LLZ;8gqn=Np5b#iuea*WD$HUoE170aYL%%C(^ zZm3ppsLrcIZE|pJhQxZ2)X<(U(4a7TK?HkL7<@Pct8f&ndl{^C8?AX5)vrR>uRPh= z|E_u(uVxIdcn`398L)jBuzn1&$p5l?7qfmMorO@!;Qz~;FP~=+&EWr_Xc3@p7NBql zp<4){XA+`k5R+F6lWZi3N(qTe1(972l3fnfsz24PLT6}b+qFjAv_agvQ)Fgl#C{Q! zRSlF|43t|9!Hgq_O9qu!43?Qpq;CkNa|o$r z3#o4ts&W^qdk@^aQr)*n-MmoVzEs}c|KGMe-@sttxIo~)R^Y%_;k7y8yino7S>n1s z;=@?u!dqx-XlR4Qt7{N>d24w+1$jjZoLvi@Uk$~JB*mC3oof|lX=lotF|>mmw1geB z$^W%<61B?z(nT3 zM(4ps=gMQ}%xCJ(Y3k2u>&{>6&S&eva+(Z zw!Xo`#m2_S%FN8n%+Ao;^j4|mQ~<$=h+Bv_SdTwc6?_5A5>EeWs;RDwxrA#B-9WP$^LE6!5gP$9N1Tp@v9_40Aab{_K!c_`Tg{mCvVLtS<0>Uk!LEKmvQg3Y_OPP_kk?!-l% zU1ugoALoZk@HgjAbxRDdyc?BjJAaBvh@&)Af<@)h_XWN;FSM;J_C6Ns7!xZC^B|Yz zx+6{X?%6x;)h=DLc2&0mJV-bvH~EStE%bMCHU13+ z#-8G!&;`l~r4=?DGP1HT0D&rtOf#4Sqm z4E62xTA>mkDN$vhM6T6x{j9@!f!gBGFa`lJBZCB+>lYg@$9wspNu=25>YCf@1w}4H wl~{b++S;tcR9jnnTOP6mr#KSeMv_1S0A9P0`+jEPxBvhE07*qoM6N<$f}jI`U;qFB diff --git a/platform/icons/src/javaee/sessionBeanBig.png b/platform/icons/src/javaee/sessionBeanBig.png deleted file mode 100644 index 686578db52bdfb42b54559b8dbca22c105006aad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1190 zcmV;X1X=ruP)8Qce}IGxtzOawva5gP$S`!eDizQ%L|@hB`XdpV_iGb97r*`#w|jLk`Xje1DvY6PIG&efZgtO_h?HocZCS=~oc(=F1!2 zYneCj?h5OCO|2>-QTrI;^BQ5#Z9=mCaikg=(f0g}}1Lq8j7Eoh(U9P3ObIlBr3IQRseZ^u@lU~(~b-TL2 zVkr!s{tM%Sy$HQ=a2g_XODGOrK}m}ntRkLF^|frxuKRf=Nm;<9oWFQc6{;Uvg1PBO zvFwF55H2xr@|<5 zuxv{P92N$9t{``*4}Q@p4_hd}O4=~1VrVcOqe1q!c4sqR-B}=2k`n?+30N4wEjZxP zMr&6FzAw;wdH_Qg#xOA+f(8=OG!RQBU|0qgAa5js{!P&lzOBHvW21#(2c_H<5YGi8 zK5`e&!E=hpyw;(G43~RK80vNP3<7wr0HYGZG{KobT3)jVr7LeMFb%`G+E;>mZ5ZBY z4(`Y>Ci0`WbmmWtTs({HJ8M8aj)BVoM*4mIo0gOae20Vh5-KduWe%pnf+i7<|9<#F z)#~;B)mS1m3cGq1xFI39LhsoD)YrS{eDM)n?jMEg5TxeEVd)vLkbnddFfGhVwKm`J zOWx77_M0WM`#KgS@`f3=k*G;PMq3~NN(9pBIas)KDc(Pn2B$LW2^heQ$HC(dsF2|g zRPe#RJ0T|cPkV88v1XIzHBTo+*i%+{%b5$q|lspAT%iIYMQs@fj zM)OD%Amly>r{&r308ny@VCvQT@fXLIjU^kuEhOtDG+gPh$)UQKKnM>+>4*SK5C~uB z04fBy_}4L=P7+;SpB(t5J^DfmiRP8jIrkddma6N(gz`b80O0|IkYK)qpePGuplhXI zrt5b9!9%-I!P~p{o{S-AAzXm!$WTGh$;OK4T3%(P;C~QE3d$6u4{!pgND%5o0s)A- z6)>T2e=Wdk03`q>0jU5LRUL)96r9NJJca+rJ^$PC4-ZbId>dYL`Tzg`07*qoM6N<$ Ef^yg>Gynhq diff --git a/platform/util/src/com/intellij/icons/AllIcons.java b/platform/util/src/com/intellij/icons/AllIcons.java index ddde83a671bb..9a388af621e6 100644 --- a/platform/util/src/com/intellij/icons/AllIcons.java +++ b/platform/util/src/com/intellij/icons/AllIcons.java @@ -641,7 +641,6 @@ public class AllIcons { public static final Icon Local = IconLoader.getIcon("/javaee/local.png"); public static final Icon LocalHome = IconLoader.getIcon("/javaee/localHome.png"); public static final Icon MessageBean = IconLoader.getIcon("/javaee/messageBean.png"); - public static final Icon MessageBeanBig = IconLoader.getIcon("/javaee/messageBeanBig.png"); public static final Icon PersistenceAttribute = IconLoader.getIcon("/javaee/persistenceAttribute.png"); public static final Icon PersistenceEmbeddable = IconLoader.getIcon("/javaee/persistenceEmbeddable.png"); public static final Icon PersistenceEntity = IconLoader.getIcon("/javaee/persistenceEntity.png"); @@ -653,7 +652,6 @@ public class AllIcons { public static final Icon PersistenceUnit = IconLoader.getIcon("/javaee/persistenceUnit.png"); public static final Icon Remote = IconLoader.getIcon("/javaee/remote.png"); public static final Icon SessionBean = IconLoader.getIcon("/javaee/sessionBean.png"); - public static final Icon SessionBeanBig = IconLoader.getIcon("/javaee/sessionBeanBig.png"); public static final Icon UpdateRunningApplication = IconLoader.getIcon("/javaee/updateRunningApplication.png"); public static final Icon Web_xml = IconLoader.getIcon("/javaee/web_xml.png"); public static final Icon WebModule = IconLoader.getIcon("/javaee/webModule.png"); From 1b605bc0022dfc5d68342eeb82095a5f1a27ae10 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Fri, 8 Jun 2012 13:37:25 +0200 Subject: [PATCH 4/9] don't take typeahead from northpanel --- .../intellij/ide/navigationToolbar/NavBarPanel.java | 11 +++++++---- .../navigationToolbar/NavBarRootPaneExtension.java | 4 ++-- .../ide/navigationToolbar/ShowNavBarAction.java | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java index 92da1859926a..45f288bedef2 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java @@ -104,7 +104,7 @@ public class NavBarPanel extends JPanel implements DataProvider, PopupOwner, Dis private boolean myDisposed = false; private RelativePoint myLocationCache; - public NavBarPanel(final Project project) { + public NavBarPanel(final Project project, boolean docked) { super(new FlowLayout(FlowLayout.LEFT, 0 , 0)); myProject = project; myModel = new NavBarModel(myProject); @@ -123,11 +123,14 @@ public class NavBarPanel extends JPanel implements DataProvider, PopupOwner, Dis } }; - final ActionCallback typeAheadDone = new ActionCallback(); - IdeFocusManager.getInstance(project).typeAheadUntil(typeAheadDone); myUpdateQueue.queueModelUpdateFromFocus(); myUpdateQueue.queueRebuildUi(); - myUpdateQueue.queueTypeAheadDone(typeAheadDone); + if (!docked) { + final ActionCallback typeAheadDone = new ActionCallback(); + IdeFocusManager.getInstance(project).typeAheadUntil(typeAheadDone); + myUpdateQueue.queueTypeAheadDone(typeAheadDone); + } + Disposer.register(project, this); } diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarRootPaneExtension.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarRootPaneExtension.java index da947c50a98a..b6adf3f44c5c 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarRootPaneExtension.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarRootPaneExtension.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -191,7 +191,7 @@ public class NavBarRootPaneExtension extends IdeRootPaneNorthExtension { if (myNavigationBar != null && !Disposer.isDisposed(myNavigationBar)) { Disposer.dispose(myNavigationBar); } - myNavigationBar = new NavBarPanel(myProject); + myNavigationBar = new NavBarPanel(myProject, true); myWrapperPanel.putClientProperty("NavBarPanel", myNavigationBar); myNavigationBar.getModel().setFixedComponent(true); diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/ShowNavBarAction.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/ShowNavBarAction.java index 053b3199028b..73d4182bae9b 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/ShowNavBarAction.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/ShowNavBarAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -39,7 +39,7 @@ public class ShowNavBarAction extends AnAction implements DumbAware, PopupAction final Component component = PlatformDataKeys.CONTEXT_COMPONENT.getData(context); if (!isInsideNavBar(component)) { final Editor editor = PlatformDataKeys.EDITOR.getData(context); - final NavBarPanel toolbarPanel = new NavBarPanel(project); + final NavBarPanel toolbarPanel = new NavBarPanel(project, false); toolbarPanel.showHint(editor, context); } } From 2c20ec0585198fad00bf972bc884cd969f59c3af Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 8 Jun 2012 11:49:25 +0400 Subject: [PATCH 5/9] new project model: module-level libraries --- .../jps/model/module/JpsDependenciesList.java | 7 +++++++ .../jetbrains/jps/model/module/JpsModule.java | 5 +++++ .../jps/model/module/JpsSdkReferencesTable.java | 3 +-- .../module/impl/JpsDependenciesListImpl.java | 17 +++++++++++++++-- .../module/impl/JpsLibraryDependencyImpl.java | 7 ++++--- .../module/impl/JpsModuleDependencyImpl.java | 8 +++++--- .../jps/model/module/impl/JpsModuleImpl.java | 12 ++++++++++++ .../module/impl/JpsSdkReferencesTableImpl.java | 5 ++--- 8 files changed, 51 insertions(+), 13 deletions(-) diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependenciesList.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependenciesList.java index 4954e81f6e5b..b4e08a983b28 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependenciesList.java +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependenciesList.java @@ -3,6 +3,7 @@ package org.jetbrains.jps.model.module; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.library.JpsLibraryReference; import org.jetbrains.jps.model.library.JpsSdkType; import java.util.List; @@ -14,9 +15,15 @@ public interface JpsDependenciesList extends JpsElement { @NotNull JpsModuleDependency addModuleDependency(@NotNull JpsModule module); + @NotNull + JpsModuleDependency addModuleDependency(@NotNull JpsModuleReference moduleReference); + @NotNull JpsLibraryDependency addLibraryDependency(@NotNull JpsLibrary libraryElement); + @NotNull + JpsLibraryDependency addLibraryDependency(@NotNull JpsLibraryReference libraryReference); + void addModuleSourceDependency(); void addSdkDependency(@NotNull JpsSdkType sdkType); diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java index 4226ad8f7850..926751aa0900 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java @@ -2,6 +2,8 @@ package org.jetbrains.jps.model.module; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.*; +import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.library.JpsLibraryType; import java.util.List; @@ -37,6 +39,9 @@ public interface JpsModule extends JpsNamedElement, JpsReferenceableElement type, @NotNull String name); + void delete(); @NotNull diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsSdkReferencesTable.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsSdkReferencesTable.java index cf0a081869a9..d4ebfda7a167 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsSdkReferencesTable.java +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsSdkReferencesTable.java @@ -3,7 +3,6 @@ package org.jetbrains.jps.model.module; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsCompositeElement; -import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsLibraryReference; import org.jetbrains.jps.model.library.JpsSdkType; @@ -14,5 +13,5 @@ public interface JpsSdkReferencesTable extends JpsCompositeElement { @Nullable JpsLibraryReference getSdkReference(@NotNull JpsSdkType type); - void setSdkReference(@NotNull JpsSdkType type, @NotNull JpsLibrary sdk); + void setSdkReference(@NotNull JpsSdkType type, @NotNull JpsLibraryReference sdkReference); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java index 09a6ec9fe5f1..0b10c4f51cf3 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java @@ -8,6 +8,7 @@ import org.jetbrains.jps.model.JpsParentElement; import org.jetbrains.jps.model.impl.JpsCompositeElementBase; import org.jetbrains.jps.model.impl.JpsElementCollectionKind; import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.library.JpsLibraryReference; import org.jetbrains.jps.model.library.JpsSdkType; import org.jetbrains.jps.model.module.*; @@ -38,7 +39,13 @@ public class JpsDependenciesListImpl extends JpsCompositeElementBase implements JpsLibraryDependency { public static final JpsElementKind LIBRARY_REFERENCE_KIND = new JpsElementKind(); - public JpsLibraryDependencyImpl(JpsModel model, JpsEventDispatcher eventDispatcher, JpsLibrary library, JpsDependenciesListImpl parent) { + public JpsLibraryDependencyImpl(JpsModel model, + JpsEventDispatcher eventDispatcher, + final JpsLibraryReference reference, JpsDependenciesListImpl parent) { super(model, eventDispatcher, parent); - myContainer.setChild(LIBRARY_REFERENCE_KIND, library.createReference(parent)); + myContainer.setChild(LIBRARY_REFERENCE_KIND, reference); } public JpsLibraryDependencyImpl(JpsLibraryDependencyImpl original, @NotNull JpsModel model, JpsEventDispatcher dispatcher, JpsParentElement parent) { diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleDependencyImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleDependencyImpl.java index 0931c60e1415..2dd4a95b209a 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleDependencyImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleDependencyImpl.java @@ -2,7 +2,6 @@ package org.jetbrains.jps.model.module.impl; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.*; -import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModuleDependency; import org.jetbrains.jps.model.module.JpsModuleReference; @@ -12,9 +11,12 @@ import org.jetbrains.jps.model.module.JpsModuleReference; public class JpsModuleDependencyImpl extends JpsDependencyElementBase implements JpsModuleDependency { private static final JpsElementKind MODULE_REFERENCE_KIND = new JpsElementKind(); - public JpsModuleDependencyImpl(JpsModel model, JpsEventDispatcher eventDispatcher, JpsModule module, JpsDependenciesListImpl parent) { + public JpsModuleDependencyImpl(JpsModel model, + JpsEventDispatcher eventDispatcher, + final JpsModuleReference moduleReference, + JpsDependenciesListImpl parent) { super(model, eventDispatcher, parent); - myContainer.setChild(MODULE_REFERENCE_KIND, module.createReference(this)); + myContainer.setChild(MODULE_REFERENCE_KIND, moduleReference); } public JpsModuleDependencyImpl(JpsModuleDependencyImpl original, JpsModel model, JpsEventDispatcher dispatcher, JpsParentElement parent) { diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java index 98c53860f232..255ad76c62f9 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java @@ -3,6 +3,10 @@ package org.jetbrains.jps.model.module.impl; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.*; import org.jetbrains.jps.model.impl.*; +import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.library.JpsLibraryType; +import org.jetbrains.jps.model.library.impl.JpsLibraryImpl; +import org.jetbrains.jps.model.library.impl.JpsLibraryKind; import org.jetbrains.jps.model.module.*; import java.util.List; @@ -22,6 +26,7 @@ public class JpsModuleImpl extends JpsNamedCompositeElementBase type, @NotNull String name) { + final JpsElementCollectionImpl collection = myContainer.getChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND); + return collection.addChild(new JpsLibraryImpl(name, type, myModel, getEventDispatcher(), collection)); + } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsSdkReferencesTableImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsSdkReferencesTableImpl.java index 79fe355b9e25..338dba78a194 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsSdkReferencesTableImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsSdkReferencesTableImpl.java @@ -6,7 +6,6 @@ import org.jetbrains.jps.model.JpsEventDispatcher; import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.model.JpsParentElement; import org.jetbrains.jps.model.impl.JpsCompositeElementBase; -import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsLibraryReference; import org.jetbrains.jps.model.library.JpsSdkType; import org.jetbrains.jps.model.module.JpsSdkReferencesTable; @@ -34,8 +33,8 @@ public class JpsSdkReferencesTableImpl extends JpsCompositeElementBase type, @NotNull JpsLibrary sdk) { - myContainer.setChild(new JpsSdkReferenceKind(type), sdk.createReference(this)); + public void setSdkReference(@NotNull JpsSdkType type, @NotNull JpsLibraryReference sdkReference) { + myContainer.setChild(new JpsSdkReferenceKind(type), sdkReference); } @Override From 856b4322a2aa2bf59abecb798390f8f15a53ded5 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 8 Jun 2012 15:45:20 +0400 Subject: [PATCH 6/9] new project model: allow to create elements detached from model --- .../org/jetbrains/jps/model/JpsElement.java | 2 +- .../jps/model/JpsElementCollection.java | 4 +- .../jps/model/JpsElementContainer.java | 4 +- .../jps/model/JpsElementCreator.java | 11 +++++ .../jps/model/JpsElementFactory.java | 15 +++++- .../model/JpsElementFactoryWithParameter.java | 11 ----- .../jetbrains/jps/model/JpsElementKind.java | 1 - .../model/JpsElementParameterizedCreator.java | 11 +++++ .../jps/model/JpsElementReference.java | 3 ++ .../src/org/jetbrains/jps/model/JpsModel.java | 2 + .../jps/model/JpsReferenceableElement.java | 2 +- .../jps/model/library/JpsLibrary.java | 3 +- .../model/library/JpsLibraryReference.java | 4 ++ .../jetbrains/jps/model/module/JpsModule.java | 2 +- .../jps/model/module/JpsModuleReference.java | 4 ++ .../jps/service/JpsServiceManager.java | 21 +++++++++ .../org.jetbrains.jps.model.JpsElementFactory | 1 + ...rg.jetbrains.jps.service.JpsServiceManager | 1 + .../model/impl/JpsCompositeElementBase.java | 14 ++---- .../jps/model/impl/JpsElementBase.java | 45 ++++++++++++++---- .../model/impl/JpsElementCollectionImpl.java | 43 +++++++++-------- .../model/impl/JpsElementCollectionKind.java | 8 ++-- .../model/impl/JpsElementContainerImpl.java | 46 +++++++++++-------- .../jps/model/impl/JpsElementFactoryImpl.java | 26 +++++++++++ .../model/impl/JpsElementReferenceBase.java | 17 +++++++ .../model/impl/JpsGlobalElementReference.java | 18 ++------ .../jps/model/impl/JpsGlobalImpl.java | 18 +++----- .../jps/model/impl/JpsModelImpl.java | 9 ++++ .../impl/JpsNamedCompositeElementBase.java | 17 ++++--- .../impl/JpsNamedElementReferenceBase.java | 13 +++--- .../impl/JpsProjectElementReference.java | 18 ++------ .../jps/model/impl/JpsProjectImpl.java | 27 +++++------ .../jps/model/impl/JpsRootElementBase.java | 41 +++++++++++++++++ .../jps/model/impl/JpsTypedDataImpl.java | 13 ++---- .../jps/model/impl/JpsUrlListImpl.java | 16 +++---- .../jps/model/impl/SimpleJpsElementImpl.java | 13 +++--- .../java/impl/JavaModuleExtensionImpl.java | 19 +++----- .../java/impl/JavaModuleExtensionKind.java | 6 +-- .../impl/JpsJavaDependencyExtensionImpl.java | 20 +++----- .../impl/JpsJavaDependencyExtensionKind.java | 9 ++-- .../model/library/impl/JpsLibraryImpl.java | 24 +++++----- .../library/impl/JpsLibraryReferenceImpl.java | 21 +++++---- .../library/impl/JpsLibraryRootImpl.java | 16 +++---- .../module/impl/JpsDependenciesListImpl.java | 27 +++++------ .../module/impl/JpsDependencyElementBase.java | 13 ++---- .../module/impl/JpsLibraryDependencyImpl.java | 16 +++---- .../module/impl/JpsModuleDependencyImpl.java | 17 +++---- .../jps/model/module/impl/JpsModuleImpl.java | 31 +++++++------ .../module/impl/JpsModuleReferenceImpl.java | 19 ++++---- .../impl/JpsModuleSourceDependency.java | 14 +++--- .../module/impl/JpsModuleSourceRootImpl.java | 17 ++++--- .../module/impl/JpsSdkDependencyImpl.java | 22 ++++----- .../impl/JpsSdkReferencesTableImpl.java | 17 +++---- .../service/impl/JpsServiceManagerImpl.java | 33 +++++++++++++ .../jps/model/JpsJavaExtensionTest.java | 4 +- .../jetbrains/jps/model/JpsLibraryTest.java | 7 +-- .../jetbrains/jps/model/JpsModelTestCase.java | 2 +- .../jetbrains/jps/model/JpsModuleTest.java | 13 ++---- 58 files changed, 500 insertions(+), 371 deletions(-) create mode 100644 jps/model-api/src/org/jetbrains/jps/model/JpsElementCreator.java delete mode 100644 jps/model-api/src/org/jetbrains/jps/model/JpsElementFactoryWithParameter.java create mode 100644 jps/model-api/src/org/jetbrains/jps/model/JpsElementParameterizedCreator.java create mode 100644 jps/model-api/src/org/jetbrains/jps/service/JpsServiceManager.java create mode 100644 jps/model-impl/src/META-INF/services/org.jetbrains.jps.model.JpsElementFactory create mode 100644 jps/model-impl/src/META-INF/services/org.jetbrains.jps.service.JpsServiceManager create mode 100644 jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java create mode 100644 jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementReferenceBase.java create mode 100644 jps/model-impl/src/org/jetbrains/jps/model/impl/JpsRootElementBase.java create mode 100644 jps/model-impl/src/org/jetbrains/jps/service/impl/JpsServiceManagerImpl.java diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElement.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElement.java index 071ea73b35e9..2b3487eb71be 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsElement.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElement.java @@ -11,7 +11,7 @@ public interface JpsElement { interface BulkModificationSupport extends JpsElement { @NotNull - E createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent); + E createCopy(); void applyChanges(@NotNull E modified); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementCollection.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementCollection.java index a95042929058..4da1ab422c3b 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementCollection.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementCollection.java @@ -11,10 +11,10 @@ public interface JpsElementCollection extends JpsParentEle List getElements(); @NotNull -

E addChild(@NotNull JpsElementFactoryWithParameter factory, @NotNull P param); +

E addChild(@NotNull JpsElementParameterizedCreator factory, @NotNull P param); @NotNull - E addChild(@NotNull JpsElementFactory factory); + E addChild(@NotNull JpsElementCreator creator); E addChild(E element); diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java index 969b3534fc53..225599f32b0e 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java @@ -10,11 +10,11 @@ public interface JpsElementContainer { T getChild(@NotNull JpsElementKind kind); @NotNull - &JpsElementFactory> + &JpsElementCreator> T setChild(@NotNull K kind); @NotNull - &JpsElementFactoryWithParameter> + &JpsElementParameterizedCreator> T setChild(@NotNull K kind, @NotNull P param); diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementCreator.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementCreator.java new file mode 100644 index 000000000000..614d6ea8c3c5 --- /dev/null +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementCreator.java @@ -0,0 +1,11 @@ +package org.jetbrains.jps.model; + +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public interface JpsElementCreator { + @NotNull + E create(); +} diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java index b06da51b9455..1e25c2197573 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java @@ -1,12 +1,23 @@ package org.jetbrains.jps.model; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.library.JpsLibraryReference; +import org.jetbrains.jps.model.module.JpsModuleReference; +import org.jetbrains.jps.service.JpsServiceManager; /** * @author nik */ -public interface JpsElementFactory { +public abstract class JpsElementFactory { + public static JpsElementFactory getInstance() { + return JpsServiceManager.getInstance().getService(JpsElementFactory.class); + } @NotNull - E create(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent); + public abstract JpsModuleReference createModuleReference(@NotNull String moduleName); + + @NotNull + public abstract JpsLibraryReference createLibraryReference(@NotNull String libraryName, + @NotNull JpsElementReference parentReference); + } diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactoryWithParameter.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactoryWithParameter.java deleted file mode 100644 index 13e9103789f6..000000000000 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactoryWithParameter.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.jetbrains.jps.model; - -import org.jetbrains.annotations.NotNull; - -/** - * @author nik - */ -public interface JpsElementFactoryWithParameter { - @NotNull - E create(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent, @NotNull P param); -} diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementKind.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementKind.java index 4e47a07bfc5a..dc3076e0c37d 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementKind.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementKind.java @@ -6,7 +6,6 @@ import org.jetbrains.annotations.NotNull; * @author nik */ public class JpsElementKind { - public void fireElementAdded(@NotNull JpsEventDispatcher dispatcher, @NotNull E element) { } diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementParameterizedCreator.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementParameterizedCreator.java new file mode 100644 index 000000000000..df601c703c4c --- /dev/null +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementParameterizedCreator.java @@ -0,0 +1,11 @@ +package org.jetbrains.jps.model; + +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public interface JpsElementParameterizedCreator { + @NotNull + E create(@NotNull P param); +} diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementReference.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementReference.java index f09bbc71ace3..ff28b4a7e29c 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementReference.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementReference.java @@ -1,5 +1,6 @@ package org.jetbrains.jps.model; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -8,4 +9,6 @@ import org.jetbrains.annotations.Nullable; public interface JpsElementReference extends JpsElement { @Nullable T resolve(); + + JpsElementReference asExternal(@NotNull JpsModel model); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsModel.java b/jps/model-api/src/org/jetbrains/jps/model/JpsModel.java index 09780fa1861f..8387e7614f9c 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsModel.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsModel.java @@ -15,5 +15,7 @@ public interface JpsModel { @NotNull JpsModel createModifiableModel(@NotNull JpsEventDispatcher eventDispatcher); + void registerExternalReference(@NotNull JpsElementReference reference); + void commit(); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsReferenceableElement.java b/jps/model-api/src/org/jetbrains/jps/model/JpsReferenceableElement.java index 4df008cce68c..765ae7c194d1 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsReferenceableElement.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsReferenceableElement.java @@ -7,5 +7,5 @@ import org.jetbrains.annotations.NotNull; */ public interface JpsReferenceableElement { @NotNull - JpsElementReference createReference(JpsParentElement parent); + JpsElementReference createReference(); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java b/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java index 45293113ecfe..1d79c0bcc107 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java +++ b/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java @@ -2,7 +2,6 @@ package org.jetbrains.jps.model.library; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.JpsNamedElement; -import org.jetbrains.jps.model.JpsParentElement; import org.jetbrains.jps.model.JpsReferenceableElement; import java.util.List; @@ -22,5 +21,5 @@ public interface JpsLibrary extends JpsNamedElement, JpsReferenceableElement { @NotNull String getLibraryName(); + + @Override + JpsLibraryReference asExternal(@NotNull JpsModel model); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java index 926751aa0900..fdc54705c502 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java @@ -37,7 +37,7 @@ public interface JpsModule extends JpsNamedElement, JpsReferenceableElement type, @NotNull String name); diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleReference.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleReference.java index 90a35bf07ec3..0449ef46868d 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleReference.java +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleReference.java @@ -2,6 +2,7 @@ package org.jetbrains.jps.model.module; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.JpsElementReference; +import org.jetbrains.jps.model.JpsModel; /** * @author nik @@ -9,4 +10,7 @@ import org.jetbrains.jps.model.JpsElementReference; public interface JpsModuleReference extends JpsElementReference { @NotNull String getModuleName(); + + @Override + JpsModuleReference asExternal(@NotNull JpsModel model); } diff --git a/jps/model-api/src/org/jetbrains/jps/service/JpsServiceManager.java b/jps/model-api/src/org/jetbrains/jps/service/JpsServiceManager.java new file mode 100644 index 000000000000..d24524ca3664 --- /dev/null +++ b/jps/model-api/src/org/jetbrains/jps/service/JpsServiceManager.java @@ -0,0 +1,21 @@ +package org.jetbrains.jps.service; + +import java.util.ServiceLoader; + +/** + * @author nik + */ +public abstract class JpsServiceManager { + public static JpsServiceManager getInstance() { + return InstanceHolder.INSTANCE; + } + + public abstract T getService(Class serviceClass); + + private static class InstanceHolder { + private static final JpsServiceManager INSTANCE; + static { + INSTANCE = ServiceLoader.load(JpsServiceManager.class).iterator().next(); + } + } +} diff --git a/jps/model-impl/src/META-INF/services/org.jetbrains.jps.model.JpsElementFactory b/jps/model-impl/src/META-INF/services/org.jetbrains.jps.model.JpsElementFactory new file mode 100644 index 000000000000..2053df115032 --- /dev/null +++ b/jps/model-impl/src/META-INF/services/org.jetbrains.jps.model.JpsElementFactory @@ -0,0 +1 @@ +org.jetbrains.jps.model.impl.JpsElementFactoryImpl \ No newline at end of file diff --git a/jps/model-impl/src/META-INF/services/org.jetbrains.jps.service.JpsServiceManager b/jps/model-impl/src/META-INF/services/org.jetbrains.jps.service.JpsServiceManager new file mode 100644 index 000000000000..6e703605a384 --- /dev/null +++ b/jps/model-impl/src/META-INF/services/org.jetbrains.jps.service.JpsServiceManager @@ -0,0 +1 @@ +org.jetbrains.jps.service.impl.JpsServiceManagerImpl \ No newline at end of file diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsCompositeElementBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsCompositeElementBase.java index c1b38364d791..70c6558560ad 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsCompositeElementBase.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsCompositeElementBase.java @@ -8,19 +8,13 @@ import org.jetbrains.jps.model.*; */ public abstract class JpsCompositeElementBase> extends JpsElementBase implements JpsCompositeElement { protected final JpsElementContainerImpl myContainer; - protected final JpsModel myModel; - protected JpsCompositeElementBase(JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(eventDispatcher, parent); - myModel = model; - myContainer = new JpsElementContainerImpl(model, eventDispatcher, this); + protected JpsCompositeElementBase() { + myContainer = new JpsElementContainerImpl(this); } - protected JpsCompositeElementBase(JpsCompositeElementBase original, JpsModel model, JpsEventDispatcher dispatcher, - JpsParentElement parent) { - super(original, dispatcher, parent); - myModel = model; - myContainer = new JpsElementContainerImpl(original.myContainer, model, dispatcher, this); + protected JpsCompositeElementBase(JpsCompositeElementBase original) { + myContainer = new JpsElementContainerImpl(original.myContainer, this); } public void applyChanges(@NotNull Self element) { diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementBase.java index 12c982d8f708..df9e701f815e 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementBase.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementBase.java @@ -1,27 +1,52 @@ package org.jetbrains.jps.model.impl; +import com.intellij.openapi.diagnostic.Logger; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.*; /** * @author nik */ public abstract class JpsElementBase> implements JpsElement, JpsElement.BulkModificationSupport { - private JpsEventDispatcher myEventDispatcher; - protected JpsParentElement myParent; + private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.model.impl.JpsElementBase"); + protected JpsElementBase myParent; - protected JpsElementBase(JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - myEventDispatcher = eventDispatcher; + protected JpsElementBase() { + } + + public void setParent(@Nullable JpsElementBase parent) { + if (myParent != null && parent != null) { + LOG.error("Parent for " + this + " is already set"); + } myParent = parent; } - public JpsElementBase(JpsElementBase original, JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - myEventDispatcher = eventDispatcher; - myParent = parent; + protected void fireElementChanged() { + final JpsEventDispatcher eventDispatcher = getEventDispatcher(); + if (eventDispatcher != null) { + eventDispatcher.fireElementChanged(this); + } } + protected static void setParent(@NotNull JpsElement element, @Nullable JpsElementBase parent) { + ((JpsElementBase)element).setParent(parent); + } + + @Nullable protected JpsEventDispatcher getEventDispatcher() { - return myEventDispatcher; + if (myParent != null) { + return myParent.getEventDispatcher(); + } + return null; + } + + @Nullable + protected JpsModel getModel() { + if (myParent != null) { + return myParent.getModel(); + } + return null; } @NotNull @@ -31,11 +56,11 @@ public abstract class JpsElementBase> implemen } @NotNull - public abstract Self createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent); + public abstract Self createCopy(); public abstract void applyChanges(@NotNull Self modified); - public JpsParentElement getParent() { + public JpsElementBase getParent() { return myParent; } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionImpl.java index 3afa780758c9..bd950d6ea6af 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionImpl.java @@ -11,30 +11,23 @@ import java.util.*; */ public class JpsElementCollectionImpl extends JpsElementBase> implements JpsElementCollection { private final List myElements; - private final JpsModel myModel; private final Map myCopyToOriginal; private final JpsElementKind myKind; - public JpsElementCollectionImpl(JpsElementKind kind, JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(eventDispatcher, parent); + public JpsElementCollectionImpl(JpsElementKind kind) { myKind = kind; - myModel = model; myElements = new SmartList(); myCopyToOriginal = null; } - public JpsElementCollectionImpl(JpsElementCollectionImpl original, - JpsModel model, - JpsEventDispatcher eventDispatcher, - JpsParentElement parent) { - super(original, eventDispatcher, parent); + public JpsElementCollectionImpl(JpsElementCollectionImpl original) { myKind = original.myKind; - myModel = model; myElements = new SmartList(); myCopyToOriginal = new HashMap(); for (E e : original.myElements) { //noinspection unchecked - final E copy = (E)e.getBulkModificationSupport().createCopy(model, eventDispatcher, parent); + final E copy = (E)e.getBulkModificationSupport().createCopy(); + setParent(copy, this); myElements.add(copy); myCopyToOriginal.put(copy, e); } @@ -47,20 +40,24 @@ public class JpsElementCollectionImpl extends JpsElementBa @NotNull @Override - public

E addChild(@NotNull JpsElementFactoryWithParameter factory, @NotNull P param) { - return addChild(factory.create(myModel, getEventDispatcher(), myParent, param)); + public

E addChild(@NotNull JpsElementParameterizedCreator factory, @NotNull P param) { + return addChild(factory.create(param)); } @NotNull @Override - public E addChild(@NotNull JpsElementFactory factory) { - return addChild(factory.create(myModel, getEventDispatcher(), myParent)); + public E addChild(@NotNull JpsElementCreator creator) { + return addChild(creator.create()); } @Override public E addChild(E element) { myElements.add(element); - getEventDispatcher().fireElementAdded(element, myKind); + setParent(element, this); + final JpsEventDispatcher eventDispatcher = getEventDispatcher(); + if (eventDispatcher != null) { + eventDispatcher.fireElementAdded(element, myKind); + } return element; } @@ -68,16 +65,18 @@ public class JpsElementCollectionImpl extends JpsElementBa public void removeChild(@NotNull E element) { final boolean removed = myElements.remove(element); if (removed) { - getEventDispatcher().fireElementRemoved(element, myKind); + final JpsEventDispatcher eventDispatcher = getEventDispatcher(); + if (eventDispatcher != null) { + eventDispatcher.fireElementRemoved(element, myKind); + } + setParent(element, null); } } @NotNull @Override - public JpsElementCollectionImpl createCopy(@NotNull JpsModel model, - @NotNull JpsEventDispatcher eventDispatcher, - JpsParentElement parent) { - return new JpsElementCollectionImpl(this, model, eventDispatcher, parent); + public JpsElementCollectionImpl createCopy() { + return new JpsElementCollectionImpl(this); } public void applyChanges(@NotNull JpsElementCollectionImpl modified) { @@ -93,7 +92,7 @@ public class JpsElementCollectionImpl extends JpsElementBa } else { //noinspection unchecked - final E copy = (E)element.getBulkModificationSupport().createCopy(myModel, getEventDispatcher(), myParent); + final E copy = (E)element.getBulkModificationSupport().createCopy(); toAdd.add(copy); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionKind.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionKind.java index 89ec021e072c..aae141b3b861 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionKind.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionKind.java @@ -7,7 +7,7 @@ import org.jetbrains.jps.model.*; * @author nik */ public class JpsElementCollectionKind extends JpsElementKind> - implements JpsElementFactory> { + implements JpsElementCreator> { private final JpsElementKind myElementKind; public JpsElementCollectionKind(JpsElementKind elementKind) { @@ -16,9 +16,7 @@ public class JpsElementCollectionKind extends JpsElementKi @NotNull @Override - public JpsElementCollectionImpl create(@NotNull JpsModel model, - @NotNull JpsEventDispatcher eventDispatcher, - JpsParentElement parent) { - return new JpsElementCollectionImpl(myElementKind, model, eventDispatcher, parent); + public JpsElementCollectionImpl create() { + return new JpsElementCollectionImpl(myElementKind); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementContainerImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementContainerImpl.java index a231add0dd96..2a77a6896844 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementContainerImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementContainerImpl.java @@ -1,6 +1,7 @@ package org.jetbrains.jps.model.impl; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.*; import java.util.HashMap; @@ -11,25 +12,19 @@ import java.util.Map; */ public class JpsElementContainerImpl implements JpsElementContainer { private final Map, JpsElement> myElements = new HashMap, JpsElement>(); - private final @NotNull JpsModel myModel; - private final @NotNull JpsEventDispatcher myEventDispatcher; - private final @NotNull JpsParentElement myParent; + private final @NotNull JpsCompositeElementBase myParent; - public JpsElementContainerImpl(@NotNull JpsModel model, - @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - myModel = model; - myEventDispatcher = eventDispatcher; + public JpsElementContainerImpl(@NotNull JpsCompositeElementBase parent) { myParent = parent; } - public JpsElementContainerImpl(@NotNull JpsElementContainerImpl original, @NotNull JpsModel model, - @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - myModel = model; - myEventDispatcher = eventDispatcher; + public JpsElementContainerImpl(@NotNull JpsElementContainerImpl original, @NotNull JpsCompositeElementBase parent) { myParent = parent; for (Map.Entry, JpsElement> entry : original.myElements.entrySet()) { final JpsElementKind kind = entry.getKey(); - myElements.put(kind, entry.getValue().getBulkModificationSupport().createCopy(myModel, myEventDispatcher, myParent)); + final JpsElement copy = entry.getValue().getBulkModificationSupport().createCopy(); + JpsElementBase.setParent(copy, myParent); + myElements.put(kind, copy); } } @@ -41,23 +36,27 @@ public class JpsElementContainerImpl implements JpsElementContainer { @NotNull @Override - public & JpsElementFactoryWithParameter> T setChild(@NotNull K kind, + public & JpsElementParameterizedCreator> T setChild(@NotNull K kind, @NotNull P param) { - final T child = kind.create(myModel, myEventDispatcher, myParent, param); + final T child = kind.create(param); return setChild(kind, child); } @NotNull @Override - public & JpsElementFactory> T setChild(@NotNull K kind) { - final T child = kind.create(myModel, myEventDispatcher, myParent); + public & JpsElementCreator> T setChild(@NotNull K kind) { + final T child = kind.create(); return setChild(kind, child); } @Override public T setChild(JpsElementKind kind, T child) { myElements.put(kind, child); - myEventDispatcher.fireElementAdded(child, kind); + JpsElementBase.setParent(child, myParent); + final JpsEventDispatcher eventDispatcher = getEventDispatcher(); + if (eventDispatcher != null) { + eventDispatcher.fireElementAdded(child, kind); + } return child; } @@ -65,7 +64,11 @@ public class JpsElementContainerImpl implements JpsElementContainer { public void removeChild(@NotNull JpsElementKind kind) { //noinspection unchecked final T removed = (T)myElements.remove(kind); - myEventDispatcher.fireElementRemoved(removed, kind); + final JpsEventDispatcher eventDispatcher = getEventDispatcher(); + if (eventDispatcher != null) { + eventDispatcher.fireElementRemoved(removed, kind); + } + JpsElementBase.setParent(removed, null); } public void applyChanges(@NotNull JpsElementContainerImpl modified) { @@ -92,7 +95,12 @@ public class JpsElementContainerImpl implements JpsElementContainer { } else { //noinspection unchecked - setChild(kind, (T)modifiedChild.getBulkModificationSupport().createCopy(myModel, myEventDispatcher, myParent)); + setChild(kind, (T)modifiedChild.getBulkModificationSupport().createCopy()); } } + + @Nullable + private JpsEventDispatcher getEventDispatcher() { + return myParent.getEventDispatcher(); + } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java new file mode 100644 index 000000000000..70492b460fe7 --- /dev/null +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java @@ -0,0 +1,26 @@ +package org.jetbrains.jps.model.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.*; +import org.jetbrains.jps.model.library.JpsLibraryReference; +import org.jetbrains.jps.model.library.impl.JpsLibraryReferenceImpl; +import org.jetbrains.jps.model.module.JpsModuleReference; +import org.jetbrains.jps.model.module.impl.JpsModuleReferenceImpl; + +/** + * @author nik + */ +public class JpsElementFactoryImpl extends JpsElementFactory { + @NotNull + @Override + public JpsModuleReference createModuleReference(@NotNull String moduleName) { + return new JpsModuleReferenceImpl(moduleName); + } + + @NotNull + @Override + public JpsLibraryReference createLibraryReference(@NotNull String libraryName, + @NotNull JpsElementReference parentReference) { + return new JpsLibraryReferenceImpl(libraryName, parentReference); + } +} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementReferenceBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementReferenceBase.java new file mode 100644 index 000000000000..3b6a86b9ade1 --- /dev/null +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementReferenceBase.java @@ -0,0 +1,17 @@ +package org.jetbrains.jps.model.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsElement; +import org.jetbrains.jps.model.JpsElementReference; +import org.jetbrains.jps.model.JpsModel; + +/** + * @author nik + */ +public abstract class JpsElementReferenceBase, T extends JpsElement> extends JpsElementBase implements JpsElementReference { + @Override + public JpsElementReference asExternal(@NotNull JpsModel model) { + model.registerExternalReference(this); + return this; + } +} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalElementReference.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalElementReference.java index 4e245d5dcf98..17f61a22047e 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalElementReference.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalElementReference.java @@ -6,25 +6,17 @@ import org.jetbrains.jps.model.*; /** * @author nik */ -public class JpsGlobalElementReference extends JpsElementBase implements JpsElementReference { - private final JpsModel myModel; - - public JpsGlobalElementReference(JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(eventDispatcher, parent); - myModel = model; - } - +public class JpsGlobalElementReference extends JpsElementReferenceBase { @Override public JpsGlobal resolve() { - return myModel.getGlobal(); + final JpsModel model = getModel(); + return model != null ? model.getGlobal() : null; } @NotNull @Override - public JpsGlobalElementReference createCopy(@NotNull JpsModel model, - @NotNull JpsEventDispatcher eventDispatcher, - JpsParentElement parent) { - return new JpsGlobalElementReference(model, eventDispatcher, parent); + public JpsGlobalElementReference createCopy() { + return new JpsGlobalElementReference(); } @Override diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalImpl.java index b6cbe9e08d04..c5bb2c500b64 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalImpl.java @@ -10,32 +10,26 @@ import org.jetbrains.jps.model.library.impl.JpsLibraryKind; /** * @author nik */ -public class JpsGlobalImpl extends JpsCompositeElementBase implements JpsGlobal { +public class JpsGlobalImpl extends JpsRootElementBase implements JpsGlobal { public JpsGlobalImpl(JpsModel model, JpsEventDispatcher eventDispatcher) { - super(model, eventDispatcher, null); + super(model, eventDispatcher); myContainer.setChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND); } public JpsGlobalImpl(JpsGlobalImpl original, JpsModel model, JpsEventDispatcher eventDispatcher) { - super(original, model, eventDispatcher, null); - } - - @NotNull - @Override - public JpsGlobalImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - return new JpsGlobalImpl(this, model, eventDispatcher); + super(original, model, eventDispatcher); } @NotNull @Override public JpsLibrary addLibrary(@NotNull JpsLibraryType libraryType, @NotNull final String name) { final JpsElementCollectionImpl collection = myContainer.getChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND); - return collection.addChild(new JpsLibraryImpl(name, libraryType, myModel, getEventDispatcher(), collection)); + return collection.addChild(new JpsLibraryImpl(name, libraryType)); } @NotNull @Override - public JpsElementReference createReference(JpsParentElement parent) { - return new JpsGlobalElementReference(myModel, getEventDispatcher(), parent); + public JpsElementReference createReference() { + return new JpsGlobalElementReference(); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsModelImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsModelImpl.java index ae6b7f4d1f8c..60e55362a367 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsModelImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsModelImpl.java @@ -1,6 +1,7 @@ package org.jetbrains.jps.model.impl; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsElementReference; import org.jetbrains.jps.model.JpsEventDispatcher; import org.jetbrains.jps.model.JpsModel; @@ -11,14 +12,17 @@ public class JpsModelImpl implements JpsModel { private JpsProjectImpl myProject; private JpsGlobalImpl myGlobal; private JpsModelImpl myOriginalModel; + private final JpsEventDispatcher myEventDispatcher; public JpsModelImpl(JpsEventDispatcher eventDispatcher) { + myEventDispatcher = eventDispatcher; myProject = new JpsProjectImpl(this, eventDispatcher); myGlobal = new JpsGlobalImpl(this, eventDispatcher); } private JpsModelImpl(JpsModelImpl original, JpsEventDispatcher eventDispatcher) { myOriginalModel = original; + myEventDispatcher = eventDispatcher; myProject = new JpsProjectImpl(original.myProject, this, eventDispatcher); myGlobal = new JpsGlobalImpl(original.myGlobal, this, eventDispatcher); } @@ -39,6 +43,11 @@ public class JpsModelImpl implements JpsModel { return new JpsModelImpl(this, eventDispatcher); } + @Override + public void registerExternalReference(@NotNull JpsElementReference reference) { + myProject.addExternalReference(reference); + } + @Override public void commit() { myOriginalModel.applyChanges(this); diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedCompositeElementBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedCompositeElementBase.java index e05473c5fab1..b5a163ad2fa0 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedCompositeElementBase.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedCompositeElementBase.java @@ -11,17 +11,13 @@ public abstract class JpsNamedCompositeElementBase original, - JpsModel model, - JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(original, model, eventDispatcher, parent); + protected JpsNamedCompositeElementBase(JpsNamedCompositeElementBase original) { + super(original); myName = original.myName; } @@ -41,7 +37,10 @@ public abstract class JpsNamedCompositeElementBase myCollectionKind; protected final String myElementName; - protected JpsNamedElementReferenceBase(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, @NotNull JpsElementCollectionKind kind, @NotNull String elementName, - @NotNull JpsElementReference parentReference, JpsParentElement parent) { - super(model, eventDispatcher, parent); + protected JpsNamedElementReferenceBase(@NotNull JpsElementCollectionKind kind, + @NotNull String elementName, + @NotNull JpsElementReference parentReference) { + super(); myCollectionKind = kind; myElementName = elementName; myContainer.setChild(PARENT_REFERENCE_KIND, parentReference); } - protected JpsNamedElementReferenceBase(JpsNamedElementReferenceBase original, - JpsModel model, JpsEventDispatcher eventDispatcher, - JpsParentElement parent) { - super(original, model, eventDispatcher, parent); + protected JpsNamedElementReferenceBase(JpsNamedElementReferenceBase original) { + super(original); myCollectionKind = original.myCollectionKind; myElementName = original.myElementName; } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectElementReference.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectElementReference.java index 1206aca4f6f7..814aeb446fa0 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectElementReference.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectElementReference.java @@ -6,25 +6,17 @@ import org.jetbrains.jps.model.*; /** * @author nik */ -public class JpsProjectElementReference extends JpsElementBase implements JpsElementReference { - private final JpsModel myModel; - - public JpsProjectElementReference(JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(eventDispatcher, parent); - myModel = model; - } - +public class JpsProjectElementReference extends JpsElementReferenceBase { @Override public JpsProject resolve() { - return myModel.getProject(); + final JpsModel model = getModel(); + return model != null ? model.getProject() : null; } @NotNull @Override - public JpsProjectElementReference createCopy(@NotNull JpsModel model, - @NotNull JpsEventDispatcher eventDispatcher, - JpsParentElement parent) { - return new JpsProjectElementReference(model, eventDispatcher, parent); + public JpsProjectElementReference createCopy() { + return new JpsProjectElementReference(); } @Override diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java index 006be0cfa53e..3720c0ba1190 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java @@ -16,29 +16,36 @@ import java.util.List; /** * @author nik */ -public class JpsProjectImpl extends JpsCompositeElementBase implements JpsProject { +public class JpsProjectImpl extends JpsRootElementBase implements JpsProject { + private static final JpsElementCollectionKind> EXTERNAL_REFERENCES_COLLECTION_KIND = new JpsElementCollectionKind>(new JpsElementKind>()); + public JpsProjectImpl(JpsModel model, JpsEventDispatcher eventDispatcher) { - super(model, eventDispatcher, null); + super(model, eventDispatcher); myContainer.setChild(JpsModuleKind.MODULE_COLLECTION_KIND); myContainer.setChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND); + myContainer.setChild(EXTERNAL_REFERENCES_COLLECTION_KIND); } public JpsProjectImpl(JpsProjectImpl original, JpsModel model, JpsEventDispatcher eventDispatcher) { - super(original, model, eventDispatcher, null); + super(original, model, eventDispatcher); + } + + public void addExternalReference(@NotNull JpsElementReference reference) { + myContainer.getChild(EXTERNAL_REFERENCES_COLLECTION_KIND).addChild(reference); } @NotNull @Override public JpsModule addModule(@NotNull JpsModuleType moduleType, @NotNull final String name) { final JpsElementCollectionImpl collection = myContainer.getChild(JpsModuleKind.MODULE_COLLECTION_KIND); - return collection.addChild(new JpsModuleImpl(myModel, getEventDispatcher(), moduleType, name, collection)); + return collection.addChild(new JpsModuleImpl(moduleType, name)); } @NotNull @Override public JpsLibrary addLibrary(@NotNull JpsLibraryType libraryType, @NotNull final String name) { final JpsElementCollectionImpl collection = myContainer.getChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND); - return collection.addChild(new JpsLibraryImpl(name, libraryType, myModel, getEventDispatcher(), collection)); + return collection.addChild(new JpsLibraryImpl(name, libraryType)); } @NotNull @@ -55,13 +62,7 @@ public class JpsProjectImpl extends JpsCompositeElementBase impl @NotNull @Override - public JpsElementReference createReference(JpsParentElement parent) { - return new JpsProjectElementReference(myModel, getEventDispatcher(), parent); - } - - @NotNull - @Override - public JpsProjectImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - return new JpsProjectImpl(this, model, eventDispatcher); + public JpsElementReference createReference() { + return new JpsProjectElementReference(); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsRootElementBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsRootElementBase.java new file mode 100644 index 000000000000..884e2b3dd569 --- /dev/null +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsRootElementBase.java @@ -0,0 +1,41 @@ +package org.jetbrains.jps.model.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsEventDispatcher; +import org.jetbrains.jps.model.JpsModel; + +/** + * @author nik + */ +public abstract class JpsRootElementBase> extends JpsCompositeElementBase { + private final JpsModel myModel; + private final JpsEventDispatcher myEventDispatcher; + + protected JpsRootElementBase(JpsModel model, JpsEventDispatcher eventDispatcher) { + super(); + myModel = model; + myEventDispatcher = eventDispatcher; + } + + protected JpsRootElementBase(JpsCompositeElementBase original, JpsModel model, JpsEventDispatcher dispatcher) { + super(original); + myModel = model; + myEventDispatcher = dispatcher; + } + + @Override + protected JpsEventDispatcher getEventDispatcher() { + return myEventDispatcher; + } + + @Override + protected JpsModel getModel() { + return myModel; + } + + @NotNull + @Override + public E createCopy() { + throw new UnsupportedOperationException("'createCopy' not implemented in " + getClass().getName()); + } +} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsTypedDataImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsTypedDataImpl.java index d09808d00015..7e6c1e6fcdc3 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsTypedDataImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsTypedDataImpl.java @@ -11,15 +11,12 @@ public class JpsTypedDataImpl> extends JpsElementBas private final T myType; private JpsElementProperties myProperties; - public JpsTypedDataImpl(T type, JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(eventDispatcher, parent); + public JpsTypedDataImpl(T type) { myType = type; myProperties = type.createDefaultProperties(); } - public JpsTypedDataImpl(JpsTypedDataImpl original, - JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(original, eventDispatcher, parent); + public JpsTypedDataImpl(JpsTypedDataImpl original) { myType = original.getType(); final JpsElementType type = original.getType(); myProperties = createCopy(type, original.myProperties); @@ -44,8 +41,8 @@ public class JpsTypedDataImpl> extends JpsElementBas @NotNull @Override - public JpsTypedDataImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - return new JpsTypedDataImpl(this, eventDispatcher, parent); + public JpsTypedDataImpl createCopy() { + return new JpsTypedDataImpl(this); } @NotNull @@ -56,7 +53,7 @@ public class JpsTypedDataImpl> extends JpsElementBas public void setProperties(@NotNull JpsElementProperties properties) { if (!myProperties.equals(properties)) { myProperties = properties; - getEventDispatcher().fireElementChanged(this); + fireElementChanged(); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsUrlListImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsUrlListImpl.java index 5d1ac3ac2ee4..de73d69659f0 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsUrlListImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsUrlListImpl.java @@ -12,19 +12,17 @@ import java.util.List; public class JpsUrlListImpl extends JpsElementBase implements JpsUrlList { private List myUrls = new ArrayList(); - public JpsUrlListImpl(JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(eventDispatcher, parent); + public JpsUrlListImpl() { } - public JpsUrlListImpl(JpsUrlListImpl list, JpsEventDispatcher dispatcher, JpsParentElement parent) { - super(list, dispatcher, parent); + public JpsUrlListImpl(JpsUrlListImpl list) { myUrls.addAll(list.myUrls); } @NotNull @Override - public JpsUrlListImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - return new JpsUrlListImpl(this, eventDispatcher, parent); + public JpsUrlListImpl createCopy() { + return new JpsUrlListImpl(this); } @NotNull @@ -36,20 +34,20 @@ public class JpsUrlListImpl extends JpsElementBase implements Jp @Override public void addUrl(@NotNull String url) { myUrls.add(url); - getEventDispatcher().fireElementChanged(this); + fireElementChanged(); } @Override public void removeUrl(@NotNull String url) { myUrls.remove(url); - getEventDispatcher().fireElementChanged(this); + fireElementChanged(); } public void applyChanges(@NotNull JpsUrlListImpl modified) { if (!myUrls.equals(modified.myUrls)) { myUrls.clear(); myUrls.addAll(modified.myUrls); - getEventDispatcher().fireElementChanged(this); + fireElementChanged(); } } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/SimpleJpsElementImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/SimpleJpsElementImpl.java index d60dd07afb8c..db16f0c05b5d 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/SimpleJpsElementImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/SimpleJpsElementImpl.java @@ -9,13 +9,12 @@ import org.jetbrains.jps.model.*; public class SimpleJpsElementImpl

extends JpsElementBase> implements SimpleJpsElement

{ private P myProperties; - public SimpleJpsElementImpl(JpsEventDispatcher eventDispatcher, P properties, JpsParentElement parent) { - super(eventDispatcher, parent); + public SimpleJpsElementImpl(P properties) { myProperties = properties; } - public SimpleJpsElementImpl(SimpleJpsElementImpl

original, JpsEventDispatcher dispatcher, JpsParentElement parent) { - super(original, dispatcher, parent); + public SimpleJpsElementImpl(SimpleJpsElementImpl

original) { + myProperties = original.myProperties; } @NotNull @@ -28,14 +27,14 @@ public class SimpleJpsElementImpl

extends JpsEle public void setProperties(@NotNull P properties) { if (!myProperties.equals(properties)) { myProperties = properties; - getEventDispatcher().fireElementChanged(this); + fireElementChanged(); } } @NotNull @Override - public SimpleJpsElementImpl

createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - return new SimpleJpsElementImpl

(this, eventDispatcher, parent); + public SimpleJpsElementImpl

createCopy() { + return new SimpleJpsElementImpl

(this); } @Override diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionImpl.java index ff5dce87d4e1..4bf2a2b70bc5 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionImpl.java @@ -2,9 +2,6 @@ package org.jetbrains.jps.model.java.impl; import com.intellij.openapi.util.Comparing; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.JpsEventDispatcher; -import org.jetbrains.jps.model.JpsModel; -import org.jetbrains.jps.model.JpsParentElement; import org.jetbrains.jps.model.impl.JpsElementBase; import org.jetbrains.jps.model.java.JavaModuleExtension; import org.jetbrains.jps.model.java.LanguageLevel; @@ -17,12 +14,10 @@ public class JavaModuleExtensionImpl extends JpsElementBase implements JpsElementFactory { +public class JavaModuleExtensionKind extends JpsElementKind implements JpsElementCreator { private static final JavaModuleExtensionKind INSTANCE = new JavaModuleExtensionKind(); @NotNull @Override - public JavaModuleExtensionImpl create(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - return new JavaModuleExtensionImpl(eventDispatcher, parent); + public JavaModuleExtensionImpl create() { + return new JavaModuleExtensionImpl(); } @NotNull diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaDependencyExtensionImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaDependencyExtensionImpl.java index 1a241a7cb87d..3faa9324a231 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaDependencyExtensionImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaDependencyExtensionImpl.java @@ -1,9 +1,6 @@ package org.jetbrains.jps.model.java.impl; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.JpsEventDispatcher; -import org.jetbrains.jps.model.JpsModel; -import org.jetbrains.jps.model.JpsParentElement; import org.jetbrains.jps.model.impl.JpsElementBase; import org.jetbrains.jps.model.java.JpsJavaDependencyExtension; import org.jetbrains.jps.model.java.JpsJavaDependencyScope; @@ -15,14 +12,13 @@ public class JpsJavaDependencyExtensionImpl extends JpsElementBase - implements JpsElementFactory { +public class JpsJavaDependencyExtensionKind extends JpsElementKind implements JpsElementCreator { public static final JpsJavaDependencyExtensionKind INSTANCE = new JpsJavaDependencyExtensionKind(); @NotNull @Override - public JpsJavaDependencyExtensionImpl create(@NotNull JpsModel model, - @NotNull JpsEventDispatcher eventDispatcher, - JpsParentElement parent) { - return new JpsJavaDependencyExtensionImpl(eventDispatcher, parent, false, JpsJavaDependencyScope.COMPILE); + public JpsJavaDependencyExtensionImpl create() { + return new JpsJavaDependencyExtensionImpl(false, JpsJavaDependencyScope.COMPILE); } public static JpsJavaDependencyExtension getExtension(@NotNull JpsDependencyElement element) { diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java index 541d81b64667..fb3794aae814 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java @@ -18,15 +18,14 @@ public class JpsLibraryImpl extends JpsNamedCompositeElementBase LIBRARY_ROOTS_COLLECTION = new JpsElementCollectionKind(JpsLibraryRootKind.INSTANCE); private static final JpsTypedDataKind> TYPED_DATA_KIND = new JpsTypedDataKind>(); - public JpsLibraryImpl(@NotNull String name, @NotNull JpsLibraryType type, @NotNull JpsModel model, - @NotNull JpsEventDispatcher eventDispatcher, JpsElementCollection parent) { - super(model, eventDispatcher, name, parent); - myContainer.setChild(TYPED_DATA_KIND, new JpsTypedDataImpl>(type, eventDispatcher, this)); + public JpsLibraryImpl(@NotNull String name, @NotNull JpsLibraryType type) { + super(name); + myContainer.setChild(TYPED_DATA_KIND, new JpsTypedDataImpl>(type)); myContainer.setChild(LIBRARY_ROOTS_COLLECTION); } - public JpsLibraryImpl(@NotNull JpsLibraryImpl original, JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(original, model, eventDispatcher, parent); + private JpsLibraryImpl(@NotNull JpsLibraryImpl original) { + super(original); } @NotNull @@ -43,7 +42,7 @@ public class JpsLibraryImpl extends JpsNamedCompositeElementBase getRootsCollection() { @@ -67,21 +66,20 @@ public class JpsLibraryImpl extends JpsNamedCompositeElementBase getParent() { - //noinspection unchecked return (JpsElementCollectionImpl)myParent; } @NotNull @Override - public JpsLibraryImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - return new JpsLibraryImpl(this, model, eventDispatcher, parent); + public JpsLibraryImpl createCopy() { + return new JpsLibraryImpl(this); } @NotNull @Override - public JpsLibraryReference createReference(JpsParentElement parent) { + public JpsLibraryReference createReference() { //noinspection unchecked - final JpsElementReference parentReference = ((JpsReferenceableElement)getParent().getParent()).createReference(parent); - return new JpsLibraryReferenceImpl(myModel, getEventDispatcher(), getName(), parentReference, parent); + final JpsElementReference parentReference = ((JpsReferenceableElement)getParent().getParent()).createReference(); + return new JpsLibraryReferenceImpl(getName(), parentReference); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryReferenceImpl.java index c78e4bdd8c0c..44ab7d92bec3 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryReferenceImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryReferenceImpl.java @@ -10,13 +10,12 @@ import org.jetbrains.jps.model.library.JpsLibraryReference; * @author nik */ public class JpsLibraryReferenceImpl extends JpsNamedElementReferenceBase implements JpsLibraryReference { - public JpsLibraryReferenceImpl(JpsModel model, JpsEventDispatcher eventDispatcher, String elementName, JpsElementReference parentReference, - JpsParentElement parent) { - super(model, eventDispatcher, JpsLibraryKind.LIBRARIES_COLLECTION_KIND, elementName, parentReference, parent); + public JpsLibraryReferenceImpl(String elementName, JpsElementReference parentReference) { + super(JpsLibraryKind.LIBRARIES_COLLECTION_KIND, elementName, parentReference); } - public JpsLibraryReferenceImpl(JpsLibraryReferenceImpl original, JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(original, model, eventDispatcher, parent); + private JpsLibraryReferenceImpl(JpsLibraryReferenceImpl original) { + super(original); } @NotNull @@ -27,9 +26,13 @@ public class JpsLibraryReferenceImpl extends JpsNamedElementReferenceBase imple private final String myUrl; private final JpsLibraryRootType myRootType; - public JpsLibraryRootImpl(JpsEventDispatcher eventDispatcher, @NotNull String url, @NotNull JpsLibraryRootType rootType, @NotNull JpsParentElement parent) { - super(eventDispatcher, parent); + public JpsLibraryRootImpl(@NotNull String url, + @NotNull JpsLibraryRootType rootType) { myUrl = url; myRootType = rootType; } - public JpsLibraryRootImpl(JpsLibraryRootImpl original, JpsEventDispatcher dispatcher, JpsParentElement parent) { - super(original, dispatcher, parent); + public JpsLibraryRootImpl(JpsLibraryRootImpl original) { myUrl = original.myUrl; myRootType = original.myRootType; } @@ -41,8 +37,8 @@ public class JpsLibraryRootImpl extends JpsElementBase imple @NotNull @Override - public JpsLibraryRootImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - return new JpsLibraryRootImpl(this, eventDispatcher, parent); + public JpsLibraryRootImpl createCopy() { + return new JpsLibraryRootImpl(this); } public void applyChanges(@NotNull JpsLibraryRootImpl modified) { @@ -51,6 +47,6 @@ public class JpsLibraryRootImpl extends JpsElementBase imple @Override @NotNull public JpsLibrary getLibrary() { - return (JpsLibrary)myParent; + return (JpsLibrary)myParent.getParent(); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java index 0b10c4f51cf3..e5c04b68cacb 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java @@ -2,9 +2,6 @@ package org.jetbrains.jps.model.module.impl; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.JpsElementKind; -import org.jetbrains.jps.model.JpsEventDispatcher; -import org.jetbrains.jps.model.JpsModel; -import org.jetbrains.jps.model.JpsParentElement; import org.jetbrains.jps.model.impl.JpsCompositeElementBase; import org.jetbrains.jps.model.impl.JpsElementCollectionKind; import org.jetbrains.jps.model.library.JpsLibrary; @@ -21,13 +18,13 @@ public class JpsDependenciesListImpl extends JpsCompositeElementBase> DEPENDENCY_ELEMENT_KIND = new JpsElementKind>(); public static final JpsElementCollectionKind> DEPENDENCY_COLLECTION_KIND = new JpsElementCollectionKind>(DEPENDENCY_ELEMENT_KIND); - public JpsDependenciesListImpl(JpsModel model, JpsEventDispatcher eventDispatcher, JpsModuleImpl parent) { - super(model, eventDispatcher, parent); + public JpsDependenciesListImpl() { + super(); myContainer.setChild(DEPENDENCY_COLLECTION_KIND); } - public JpsDependenciesListImpl(JpsDependenciesListImpl original, JpsModel model, JpsEventDispatcher dispatcher, JpsParentElement parent) { - super(original, model, dispatcher, parent); + private JpsDependenciesListImpl(JpsDependenciesListImpl original) { + super(original); } @Override @@ -39,13 +36,13 @@ public class JpsDependenciesListImpl extends JpsCompositeElementBase sdkType) { - myContainer.getChild(DEPENDENCY_COLLECTION_KIND).addChild(new JpsSdkDependencyImpl(sdkType, myModel, getEventDispatcher(), this)); + myContainer.getChild(DEPENDENCY_COLLECTION_KIND).addChild(new JpsSdkDependencyImpl(sdkType)); } @NotNull @Override - public JpsDependenciesListImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - return new JpsDependenciesListImpl(this, model, eventDispatcher, parent); + public JpsDependenciesListImpl createCopy() { + return new JpsDependenciesListImpl(this); } @Override diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependencyElementBase.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependencyElementBase.java index 4be465b91799..9d8d6c758cd9 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependencyElementBase.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependencyElementBase.java @@ -1,8 +1,5 @@ package org.jetbrains.jps.model.module.impl; -import org.jetbrains.jps.model.JpsEventDispatcher; -import org.jetbrains.jps.model.JpsModel; -import org.jetbrains.jps.model.JpsParentElement; import org.jetbrains.jps.model.impl.JpsCompositeElementBase; import org.jetbrains.jps.model.module.JpsDependencyElement; @@ -10,16 +7,16 @@ import org.jetbrains.jps.model.module.JpsDependencyElement; * @author nik */ public abstract class JpsDependencyElementBase> extends JpsCompositeElementBase implements JpsDependencyElement { - protected JpsDependencyElementBase(JpsModel model, JpsEventDispatcher eventDispatcher, JpsDependenciesListImpl parent) { - super(model, eventDispatcher, parent); + protected JpsDependencyElementBase() { + super(); } - protected JpsDependencyElementBase(JpsDependencyElementBase original, JpsModel model, JpsEventDispatcher dispatcher, JpsParentElement parent) { - super(original, model, dispatcher, parent); + protected JpsDependencyElementBase(JpsDependencyElementBase original) { + super(original); } @Override public void remove() { - ((JpsDependenciesListImpl)myParent).getContainer().getChild(JpsDependenciesListImpl.DEPENDENCY_COLLECTION_KIND).removeChild(this); + ((JpsDependenciesListImpl)myParent.getParent()).getContainer().getChild(JpsDependenciesListImpl.DEPENDENCY_COLLECTION_KIND).removeChild(this); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsLibraryDependencyImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsLibraryDependencyImpl.java index 9b75babb3faa..7e2eba50a317 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsLibraryDependencyImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsLibraryDependencyImpl.java @@ -11,15 +11,13 @@ import org.jetbrains.jps.model.module.JpsLibraryDependency; public class JpsLibraryDependencyImpl extends JpsDependencyElementBase implements JpsLibraryDependency { public static final JpsElementKind LIBRARY_REFERENCE_KIND = new JpsElementKind(); - public JpsLibraryDependencyImpl(JpsModel model, - JpsEventDispatcher eventDispatcher, - final JpsLibraryReference reference, JpsDependenciesListImpl parent) { - super(model, eventDispatcher, parent); + public JpsLibraryDependencyImpl(final JpsLibraryReference reference) { + super(); myContainer.setChild(LIBRARY_REFERENCE_KIND, reference); } - public JpsLibraryDependencyImpl(JpsLibraryDependencyImpl original, @NotNull JpsModel model, JpsEventDispatcher dispatcher, JpsParentElement parent) { - super(original, model, dispatcher, parent); + public JpsLibraryDependencyImpl(JpsLibraryDependencyImpl original) { + super(original); } @NotNull @@ -30,9 +28,7 @@ public class JpsLibraryDependencyImpl extends JpsDependencyElementBase implements JpsModuleDependency { private static final JpsElementKind MODULE_REFERENCE_KIND = new JpsElementKind(); - public JpsModuleDependencyImpl(JpsModel model, - JpsEventDispatcher eventDispatcher, - final JpsModuleReference moduleReference, - JpsDependenciesListImpl parent) { - super(model, eventDispatcher, parent); + public JpsModuleDependencyImpl(final JpsModuleReference moduleReference) { + super(); myContainer.setChild(MODULE_REFERENCE_KIND, moduleReference); } - public JpsModuleDependencyImpl(JpsModuleDependencyImpl original, JpsModel model, JpsEventDispatcher dispatcher, JpsParentElement parent) { - super(original, model, dispatcher, parent); + public JpsModuleDependencyImpl(JpsModuleDependencyImpl original) { + super(original); } @NotNull @@ -31,9 +28,7 @@ public class JpsModuleDependencyImpl extends JpsDependencyElementBase EXCLUDED_ROOTS_KIND = new JpsElementKind(); public static final JpsElementKind DEPENDENCIES_LIST_KIND = new JpsElementKind(); - public JpsModuleImpl(JpsModel model, JpsEventDispatcher eventDispatcher, JpsModuleType type, @NotNull String name, JpsElementCollectionImpl parent) { - super(model, eventDispatcher, name, parent); - myContainer.setChild(TYPED_DATA_KIND, new JpsTypedDataImpl>(type, eventDispatcher, this)); - myContainer.setChild(CONTENT_ROOTS_KIND, new JpsUrlListImpl(eventDispatcher, this)); - myContainer.setChild(EXCLUDED_ROOTS_KIND, new JpsUrlListImpl(eventDispatcher, this)); - myContainer.setChild(DEPENDENCIES_LIST_KIND, new JpsDependenciesListImpl(model, eventDispatcher, this)); + public JpsModuleImpl(JpsModuleType type, + @NotNull String name) { + super(name); + myContainer.setChild(TYPED_DATA_KIND, new JpsTypedDataImpl>(type)); + myContainer.setChild(CONTENT_ROOTS_KIND, new JpsUrlListImpl()); + myContainer.setChild(EXCLUDED_ROOTS_KIND, new JpsUrlListImpl()); + myContainer.setChild(DEPENDENCIES_LIST_KIND, new JpsDependenciesListImpl()); myContainer.setChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND); myContainer.setChild(JpsModuleSourceRootKind.ROOT_COLLECTION_KIND); - myContainer.setChild(JpsSdkReferencesTableImpl.KIND, new JpsSdkReferencesTableImpl(model, eventDispatcher, this)); + myContainer.setChild(JpsSdkReferencesTableImpl.KIND, new JpsSdkReferencesTableImpl()); } - public JpsModuleImpl(JpsModuleImpl original, JpsEventDispatcher eventDispatcher, JpsModel model, JpsParentElement parent) { - super(original, model, eventDispatcher, parent); + private JpsModuleImpl(JpsModuleImpl original) { + super(original); } @NotNull @Override - public JpsModuleImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - return new JpsModuleImpl(this, eventDispatcher, model, parent); + public JpsModuleImpl createCopy() { + return new JpsModuleImpl(this); } @NotNull @@ -70,7 +71,7 @@ public class JpsModuleImpl extends JpsNamedCompositeElementBase JpsModuleSourceRoot addSourceRoot(@NotNull JpsModuleSourceRootType

rootType, @NotNull String url, @NotNull P properties) { - final JpsModuleSourceRootImpl root = new JpsModuleSourceRootImpl(myModel, getEventDispatcher(), url, rootType, this); + final JpsModuleSourceRootImpl root = new JpsModuleSourceRootImpl(url, rootType); myContainer.getChild(JpsModuleSourceRootKind.ROOT_COLLECTION_KIND).addChild(root); root.setProperties(rootType, properties); return root; @@ -107,14 +108,14 @@ public class JpsModuleImpl extends JpsNamedCompositeElementBase type, @NotNull String name) { final JpsElementCollectionImpl collection = myContainer.getChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND); - return collection.addChild(new JpsLibraryImpl(name, type, myModel, getEventDispatcher(), collection)); + return collection.addChild(new JpsLibraryImpl(name, type)); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleReferenceImpl.java index 0d9d6a3607fa..f64a397ec1c3 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleReferenceImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleReferenceImpl.java @@ -1,10 +1,7 @@ package org.jetbrains.jps.model.module.impl; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.JpsCompositeElement; -import org.jetbrains.jps.model.JpsEventDispatcher; import org.jetbrains.jps.model.JpsModel; -import org.jetbrains.jps.model.JpsParentElement; import org.jetbrains.jps.model.impl.JpsNamedElementReferenceBase; import org.jetbrains.jps.model.impl.JpsProjectElementReference; import org.jetbrains.jps.model.module.JpsModule; @@ -14,16 +11,14 @@ import org.jetbrains.jps.model.module.JpsModuleReference; * @author nik */ public class JpsModuleReferenceImpl extends JpsNamedElementReferenceBase implements JpsModuleReference { - public JpsModuleReferenceImpl(JpsModel model, String elementName, JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(model, eventDispatcher, JpsModuleKind.MODULE_COLLECTION_KIND, elementName, new JpsProjectElementReference(model, eventDispatcher, parent), parent); + public JpsModuleReferenceImpl(String elementName) { + super(JpsModuleKind.MODULE_COLLECTION_KIND, elementName, new JpsProjectElementReference()); } @NotNull @Override - public JpsModuleReferenceImpl createCopy(@NotNull JpsModel model, - @NotNull JpsEventDispatcher eventDispatcher, - JpsParentElement parent) { - return new JpsModuleReferenceImpl(model, myElementName, eventDispatcher, parent); + public JpsModuleReferenceImpl createCopy() { + return new JpsModuleReferenceImpl(myElementName); } @NotNull @@ -31,4 +26,10 @@ public class JpsModuleReferenceImpl extends JpsNamedElementReferenceBase { - public JpsModuleSourceDependency(JpsModel model, JpsEventDispatcher eventDispatcher, JpsDependenciesListImpl parent) { - super(model, eventDispatcher, parent); + public JpsModuleSourceDependency() { + super(); } - public JpsModuleSourceDependency(JpsModuleSourceDependency original, JpsModel model, JpsEventDispatcher dispatcher, JpsParentElement parent) { - super(original, model, dispatcher, parent); + public JpsModuleSourceDependency(JpsModuleSourceDependency original) { + super(original); } @NotNull @Override - public JpsModuleSourceDependency createCopy(@NotNull JpsModel model, - @NotNull JpsEventDispatcher eventDispatcher, - JpsParentElement parent) { - return new JpsModuleSourceDependency(this, model, eventDispatcher, parent); + public JpsModuleSourceDependency createCopy() { + return new JpsModuleSourceDependency(this); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootImpl.java index 61fe889ae060..e23f0f56b4f2 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootImpl.java @@ -15,16 +15,15 @@ public class JpsModuleSourceRootImpl extends JpsCompositeElementBase> TYPED_DATA_KIND = new JpsTypedDataKind>(); private String myUrl; - public JpsModuleSourceRootImpl(JpsModel model, JpsEventDispatcher eventDispatcher, - String url, - JpsModuleSourceRootType type, JpsParentElement parent) { - super(model, eventDispatcher, parent); - myContainer.setChild(TYPED_DATA_KIND, new JpsTypedDataImpl>(type, eventDispatcher, this)); + public JpsModuleSourceRootImpl(String url, + JpsModuleSourceRootType type) { + super(); + myContainer.setChild(TYPED_DATA_KIND, new JpsTypedDataImpl>(type)); myUrl = url; } - public JpsModuleSourceRootImpl(JpsModuleSourceRootImpl original, JpsModel model, JpsEventDispatcher dispatcher, JpsParentElement parent) { - super(original, model, dispatcher, parent); + private JpsModuleSourceRootImpl(JpsModuleSourceRootImpl original) { + super(original); myUrl = original.myUrl; } @@ -51,7 +50,7 @@ public class JpsModuleSourceRootImpl extends JpsCompositeElementBase implements JpsSdkDependency { private final JpsSdkType mySdkType; - public JpsSdkDependencyImpl(@NotNull JpsSdkType sdkType, JpsModel model, JpsEventDispatcher eventDispatcher, JpsDependenciesListImpl parent) { - super(model, eventDispatcher, parent); + public JpsSdkDependencyImpl(@NotNull JpsSdkType sdkType) { + super(); mySdkType = sdkType; } - public JpsSdkDependencyImpl(JpsSdkDependencyImpl original, JpsModel model, JpsEventDispatcher dispatcher, JpsParentElement parent) { - super(original, model, dispatcher, parent); + public JpsSdkDependencyImpl(JpsSdkDependencyImpl original) { + super(original); mySdkType = original.mySdkType; } @NotNull @Override - public JpsSdkDependencyImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - return new JpsSdkDependencyImpl(this, model, eventDispatcher, parent); + public JpsSdkDependencyImpl createCopy() { + return new JpsSdkDependencyImpl(this); } @Override @@ -39,12 +36,11 @@ public class JpsSdkDependencyImpl extends JpsDependencyElementBase implements JpsSdkReferencesTable { public static final JpsElementKind KIND = new JpsElementKind(); - public JpsSdkReferencesTableImpl(JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) { - super(model, eventDispatcher, parent); + public JpsSdkReferencesTableImpl() { + super(); } - public JpsSdkReferencesTableImpl(JpsSdkReferencesTableImpl original, JpsModel model, JpsEventDispatcher dispatcher, JpsParentElement parent) { - super(original, model, dispatcher, parent); + private JpsSdkReferencesTableImpl(JpsSdkReferencesTableImpl original) { + super(original); } @NotNull @Override - public JpsSdkReferencesTableImpl createCopy(@NotNull JpsModel model, - @NotNull JpsEventDispatcher eventDispatcher, - JpsParentElement parent) { - return new JpsSdkReferencesTableImpl(this, model, eventDispatcher, parent); + public JpsSdkReferencesTableImpl createCopy() { + return new JpsSdkReferencesTableImpl(this); } @Override diff --git a/jps/model-impl/src/org/jetbrains/jps/service/impl/JpsServiceManagerImpl.java b/jps/model-impl/src/org/jetbrains/jps/service/impl/JpsServiceManagerImpl.java new file mode 100644 index 000000000000..4f9c546a4cef --- /dev/null +++ b/jps/model-impl/src/org/jetbrains/jps/service/impl/JpsServiceManagerImpl.java @@ -0,0 +1,33 @@ +package org.jetbrains.jps.service.impl; + +import org.jetbrains.jps.service.JpsServiceManager; + +import java.util.Iterator; +import java.util.ServiceConfigurationError; +import java.util.ServiceLoader; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author nik + */ +public class JpsServiceManagerImpl extends JpsServiceManager { + private final ConcurrentHashMap myServices = new ConcurrentHashMap(); + + @Override + public T getService(Class serviceClass) { + //noinspection unchecked + T service = (T)myServices.get(serviceClass); + if (service == null) { + final Iterator iterator = ServiceLoader.load(serviceClass).iterator(); + if (!iterator.hasNext()) { + throw new ServiceConfigurationError("Implementation for " + serviceClass + " not found"); + } + service = iterator.next(); + if (iterator.hasNext()) { + throw new ServiceConfigurationError("More than one implementation for " + serviceClass + " found: " + service.getClass() + " and " + iterator.next().getClass()); + } + myServices.putIfAbsent(serviceClass, service); + } + return service; + } +} diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java index a5d3bf2a71fb..0b5609390503 100644 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java +++ b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java @@ -1,10 +1,10 @@ package org.jetbrains.jps.model; +import org.jetbrains.jps.model.java.JpsJavaDependencyExtension; import org.jetbrains.jps.model.java.JpsJavaDependencyScope; import org.jetbrains.jps.model.java.JpsJavaLibraryType; import org.jetbrains.jps.model.java.JpsJavaModuleType; import org.jetbrains.jps.model.java.impl.JavaModuleExtensionKind; -import org.jetbrains.jps.model.java.impl.JpsJavaDependencyExtensionImpl; import org.jetbrains.jps.model.java.impl.JpsJavaDependencyExtensionKind; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.module.JpsDependencyElement; @@ -31,7 +31,7 @@ public class JpsJavaExtensionTest extends JpsModelTestCase { model.commit(); final JpsDependencyElement dep = assertOneElement(assertOneElement(myModel.getProject().getModules()).getDependenciesList().getDependencies()); - final JpsJavaDependencyExtensionImpl extension = dep.getContainer().getChild(JpsJavaDependencyExtensionKind.INSTANCE); + final JpsJavaDependencyExtension extension = dep.getContainer().getChild(JpsJavaDependencyExtensionKind.INSTANCE); assertTrue(extension.isExported()); assertSame(JpsJavaDependencyScope.TEST, extension.getScope()); } diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsLibraryTest.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsLibraryTest.java index f437c6d7e192..7410eec8f26e 100644 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsLibraryTest.java +++ b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsLibraryTest.java @@ -1,11 +1,9 @@ package org.jetbrains.jps.model; -import org.jetbrains.jps.model.impl.JpsProjectImpl; import org.jetbrains.jps.model.java.JpsJavaLibraryType; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsLibraryReference; import org.jetbrains.jps.model.library.JpsLibraryRootType; -import org.jetbrains.jps.model.library.impl.JpsLibraryReferenceImpl; /** * @author nik @@ -31,14 +29,13 @@ public class JpsLibraryTest extends JpsModelTestCase { public void testCreateReferenceByLibrary() { final JpsLibrary library = myModel.getProject().addLibrary(JpsJavaLibraryType.INSTANCE, "l"); - final JpsLibraryReference reference = library.createReference(myModel.getProject()); + final JpsLibraryReference reference = library.createReference().asExternal(myModel); assertEquals("l", reference.getLibraryName()); assertSame(library, reference.resolve()); } public void testCreateReferenceByName() { - final JpsProjectImpl project = myModel.getProject(); - JpsLibraryReference reference = new JpsLibraryReferenceImpl(myModel, myDispatcher, "l", myModel.getProject().createReference(project), project); + JpsLibraryReference reference = JpsElementFactory.getInstance().createLibraryReference("l", myModel.getProject().createReference()).asExternal(myModel); assertEquals("l", reference.getLibraryName()); assertNull(reference.resolve()); diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModelTestCase.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModelTestCase.java index fb3b425b68c2..2f3cc044f38a 100644 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModelTestCase.java +++ b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModelTestCase.java @@ -7,7 +7,7 @@ import org.jetbrains.jps.model.impl.JpsModelImpl; * @author nik */ public abstract class JpsModelTestCase extends UsefulTestCase { - protected JpsModelImpl myModel; + protected JpsModel myModel; protected TestJpsEventDispatcher myDispatcher; public void setUp() throws Exception { diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModuleTest.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModuleTest.java index 65ccac9ac2b9..b521774842b4 100644 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModuleTest.java +++ b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModuleTest.java @@ -1,10 +1,8 @@ package org.jetbrains.jps.model; -import org.jetbrains.jps.model.impl.JpsProjectImpl; import org.jetbrains.jps.model.java.*; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.module.*; -import org.jetbrains.jps.model.module.impl.JpsModuleReferenceImpl; import java.util.List; @@ -74,32 +72,31 @@ public class JpsModuleTest extends JpsModelTestCase { m.getDependenciesList().getDependencies().get(0).remove(); m.getDependenciesList().addModuleDependency(dep); modifiableModel.commit(); - assertSame(library, assertOneElement(myDispatcher.retrieveRemoved(JpsLibraryDependency.class)).getLibraryReference().resolve()); + assertOneElement(myDispatcher.retrieveRemoved(JpsLibraryDependency.class)); assertSame(dep, assertOneElement(myDispatcher.retrieveAdded(JpsModuleDependency.class)).getModuleReference().resolve()); assertSame(dep, assertInstanceOf(assertOneElement(module.getDependenciesList().getDependencies()), JpsModuleDependency.class).getModuleReference().resolve()); } public void testCreateReferenceByModule() { final JpsModule module = myModel.getProject().addModule(JpsJavaModuleType.INSTANCE, "m"); - final JpsModuleReference reference = module.createReference(myModel.getProject()); + final JpsModuleReference reference = module.createReference().asExternal(myModel); assertEquals("m", reference.getModuleName()); assertSame(module, reference.resolve()); } public void testCreateReferenceByName() { - final JpsProjectImpl project = myModel.getProject(); - final JpsModuleReference reference = new JpsModuleReferenceImpl(myModel, "m", myDispatcher, project); + final JpsModuleReference reference = JpsElementFactory.getInstance().createModuleReference("m").asExternal(myModel); assertEquals("m", reference.getModuleName()); assertNull(reference.resolve()); - final JpsModule module = project.addModule(JpsJavaModuleType.INSTANCE, "m"); + final JpsModule module = myModel.getProject().addModule(JpsJavaModuleType.INSTANCE, "m"); assertSame(module, reference.resolve()); } public void testSdkDependency() { JpsLibrary sdk = myModel.getGlobal().addLibrary(JpsJavaSdkType.INSTANCE, "sdk"); final JpsModule module = myModel.getProject().addModule(JpsJavaModuleType.INSTANCE, "m"); - module.getSdkReferencesTable().setSdkReference(JpsJavaSdkType.INSTANCE, sdk); + module.getSdkReferencesTable().setSdkReference(JpsJavaSdkType.INSTANCE, sdk.createReference()); module.getDependenciesList().addSdkDependency(JpsJavaSdkType.INSTANCE); final JpsSdkDependency dependency = assertInstanceOf(assertOneElement(module.getDependenciesList().getDependencies()), JpsSdkDependency.class); From 7893af1fe4f48cc6bdd02f1524832812bab2ef60 Mon Sep 17 00:00:00 2001 From: "andrey.zaytsev" Date: Tue, 5 Jun 2012 13:52:25 +0400 Subject: [PATCH 7/9] IDEA-70254 Change preserve case to checkbox instead of drop down --- .../intellij/find/EditorSearchComponent.java | 20 ++++++++++++------- .../editorHeaderActions/ToggleMatchCase.java | 2 +- .../TogglePreserveCaseAction.java | 2 +- .../ToggleSelectionOnlyAction.java | 2 +- .../ToggleWholeWordsOnlyAction.java | 2 +- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java index a860dac383f8..2ad2a9060126 100644 --- a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java +++ b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java @@ -273,8 +273,10 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data myLeadPanel.add(myToolbarComponent); - if (myToolbarComponent instanceof ActionToolbarImpl) { - new ShowMoreOptions(myToolbarComponent, mySearchField); + if (secondaryActionsAvailable()) { + if (myToolbarComponent instanceof ActionToolbarImpl) { + new ShowMoreOptions(myToolbarComponent, mySearchField); + } } @@ -358,11 +360,11 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data myActionsToolbar.setSecondaryActionsTooltip("More Options(" + ShowMoreOptions.SHORT_CUT + ")"); actionGroup.addAction(new ToggleWholeWordsOnlyAction(this)); - if (FindManagerImpl.ourHasSearchInCommentsAndLiterals) { + if (secondaryActionsAvailable()) { actionGroup.addAction(new ToggleInCommentsAction(this)).setAsSecondary(true); actionGroup.addAction(new ToggleInLiteralsOnlyAction(this)).setAsSecondary(true); } - actionGroup.addAction(new TogglePreserveCaseAction(this)).setAsSecondary(true); + actionGroup.addAction(new TogglePreserveCaseAction(this)); actionGroup.addAction(new ToggleSelectionOnlyAction(this)); @@ -372,6 +374,10 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data myToolbarComponent.setOpaque(false); } + private boolean secondaryActionsAvailable() { + return FindManagerImpl.ourHasSearchInCommentsAndLiterals; + } + private void setupSearchFieldListener() { mySearchField.getDocument().addDocumentListener(new DocumentListener() { @Override @@ -484,9 +490,9 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data myReplaceField = createTextField(myReplacementPane); myReplaceUndo = new TextComponentUndoProvider(myReplaceField); - if (myToolbarComponent instanceof ActionToolbarImpl) { - new ShowMoreOptions(myToolbarComponent, myReplaceField); - } + //if (myToolbarComponent instanceof ActionToolbarImpl) { + // new ShowMoreOptions(myToolbarComponent, myReplaceField); + //} DocumentListener replaceFieldListener = new DocumentListener() { @Override diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleMatchCase.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleMatchCase.java index 2c046f81a319..c6eb2dde40c2 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleMatchCase.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleMatchCase.java @@ -20,7 +20,7 @@ import com.intellij.find.FindSettings; import com.intellij.openapi.actionSystem.AnActionEvent; public class ToggleMatchCase extends EditorHeaderToggleAction { - private static final String CASE_SENSITIVE = "&Case Sensitive"; + private static final String CASE_SENSITIVE = "&Match Case"; public ToggleMatchCase(EditorSearchComponent editorSearchComponent) { super(editorSearchComponent, CASE_SENSITIVE); diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/TogglePreserveCaseAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/TogglePreserveCaseAction.java index 03b5f19b93cc..1afb00177923 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/TogglePreserveCaseAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/TogglePreserveCaseAction.java @@ -5,7 +5,7 @@ import com.intellij.find.FindModel; import com.intellij.openapi.actionSystem.AnActionEvent; public class TogglePreserveCaseAction extends EditorHeaderToggleAction implements SecondaryHeaderAction { - private static final String TEXT = "&Preserve Case"; + private static final String TEXT = "Preserve &Case"; public TogglePreserveCaseAction(EditorSearchComponent editorSearchComponent) { super(editorSearchComponent, TEXT); diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleSelectionOnlyAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleSelectionOnlyAction.java index 63111e0e2693..2a8c6ee8add7 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleSelectionOnlyAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleSelectionOnlyAction.java @@ -4,7 +4,7 @@ import com.intellij.find.EditorSearchComponent; import com.intellij.openapi.actionSystem.AnActionEvent; public class ToggleSelectionOnlyAction extends EditorHeaderToggleAction { - private static final String SELECTION_ONLY = "&Selection Only"; + private static final String SELECTION_ONLY = "In &Selection"; public ToggleSelectionOnlyAction(EditorSearchComponent editorSearchComponent) { super(editorSearchComponent, SELECTION_ONLY); diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleWholeWordsOnlyAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleWholeWordsOnlyAction.java index 03ab03cb5032..e3fff478f6a7 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleWholeWordsOnlyAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleWholeWordsOnlyAction.java @@ -5,7 +5,7 @@ import com.intellij.find.FindSettings; import com.intellij.openapi.actionSystem.AnActionEvent; public class ToggleWholeWordsOnlyAction extends EditorHeaderToggleAction { - private static final String WHOLE_WORDS_ONLY = "W&hole Words"; + private static final String WHOLE_WORDS_ONLY = "W&ords"; public ToggleWholeWordsOnlyAction(EditorSearchComponent editorSearchComponent) { super(editorSearchComponent, WHOLE_WORDS_ONLY); From a66b70ed42f2a58d4c811549c21fa33fce4692a6 Mon Sep 17 00:00:00 2001 From: "andrey.zaytsev" Date: Fri, 8 Jun 2012 15:46:37 +0400 Subject: [PATCH 8/9] breakpoints ui. master breakpoint preview --- .../ui/breakpoints/BreakpointChooser.java | 223 ++++++++++++++++ .../BreakpointPropertiesPanel.java | 243 ++++++++---------- .../ui/breakpoints/JavaBreakpointItem.java | 28 +- .../intellij/ui/popup/util/DetailView.java | 66 ++++- .../intellij/ui/popup/util/ItemWrapper.java | 10 - .../intellij/ui/popup/util/SplitterItem.java | 5 - .../intellij/ide/bookmarks/BookmarkItem.java | 15 +- .../bookmarks/actions/BookmarksAction.java | 14 +- .../ui/popup/util/DetailViewImpl.java | 51 ++-- .../popup/util/MasterDetailPopupBuilder.java | 117 ++++++--- .../actionSystem/ex/ComboBoxAction.java | 5 +- .../intellij/openapi/ui/popup/ListPopup.java | 2 + .../intellij/ui/ColoredTreeCellRenderer.java | 6 +- .../intellij/ui/popup/list/ListPopupImpl.java | 1 + .../breakpoints/ui/BreakpointItem.java | 61 ++++- .../impl/breakpoints/XBreakpointItem.java | 37 +-- .../BreakpointsMasterDetailPopupFactory.java | 15 +- .../ui/tree/BreakpointItemNode.java | 33 +++ .../BreakpointItemsTreeController.java} | 103 +++----- .../BreakpointMasterDetailPopupBuilder.java | 203 ++++++++++----- .../ui/tree/BreakpointsCheckboxTree.java | 55 ++++ .../ui/tree/BreakpointsGroupNode.java | 39 +++ .../ui/tree/BreakpointsSimpleTree.java | 26 ++ .../ui/tree/BreakpointsTreeCellRenderer.java | 67 +++++ .../tasks/actions/SwitchTaskCombo.java | 4 +- .../actions/AbstractComboBoxAction.java | 3 +- 26 files changed, 1030 insertions(+), 402 deletions(-) create mode 100644 java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointChooser.java create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointItemNode.java rename platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/{BreakpointItemsTree.java => tree/BreakpointItemsTreeController.java} (74%) rename platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/{ => tree}/BreakpointMasterDetailPopupBuilder.java (58%) create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsCheckboxTree.java create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsGroupNode.java create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsSimpleTree.java create mode 100644 platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsTreeCellRenderer.java diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointChooser.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointChooser.java new file mode 100644 index 000000000000..3eaf0476498e --- /dev/null +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointChooser.java @@ -0,0 +1,223 @@ +/* + * Copyright 2000-2012 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. + */ +package com.intellij.debugger.ui.breakpoints; + +import com.intellij.debugger.DebuggerBundle; +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.ex.ComboBoxAction; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.popup.JBPopup; +import com.intellij.openapi.ui.popup.JBPopupListener; +import com.intellij.openapi.ui.popup.LightweightWindowEvent; +import com.intellij.openapi.util.Key; +import com.intellij.ui.popup.util.DetailView; +import com.intellij.xdebugger.breakpoints.ui.BreakpointItem; +import com.intellij.xdebugger.impl.breakpoints.ui.tree.BreakpointMasterDetailPopupBuilder; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.Collection; + +public class BreakpointChooser { + private Project myProject; + + private DetailView myDetailView; + + private ActionToolbar myActionToolbar; + private BreakpointItem myBreakpointItem; + + private Delegate myDelegate; + private final ComboBoxAction myComboBoxAction; + private BreakpointMasterDetailPopupBuilder myPopupBuilder; + + private Object mySelectedBreakpoint; + + public void setDetailView(DetailView detailView) { + myDetailView = detailView; + } + + public Object getSelectedBreakpoint() { + return mySelectedBreakpoint; + } + + public BreakpointItem getBreakpointItem() { + return myBreakpointItem; + } + + public void setSelectedBreakpoint(Object selectedBreakpoint) { + mySelectedBreakpoint = selectedBreakpoint; + myBreakpointItem = selectedBreakpoint != null ? new JavaBreakpointItem(null, (Breakpoint)selectedBreakpoint) : null; + updatePresentation(myComboBoxAction.getTemplatePresentation(), myBreakpointItem); + myActionToolbar.getComponent().repaint(); + } + + private void pop(DetailView.PreviewEditorState pushed) { + if (pushed.getFile() != null) { + myDetailView + .navigateInPreviewEditor( + new DetailView.PreviewEditorState(pushed.getFile(), pushed.getNavigate(), pushed.getAttributes())); + } + else { + myDetailView.clearEditor(); + } + } + public interface Delegate { + void breakpointChosen(Project project, BreakpointItem breakpointItem, JBPopup popup); + } + + public BreakpointChooser(Project project, Delegate delegate) { + myProject = project; + myDelegate = delegate; + + myPopupBuilder = new BreakpointMasterDetailPopupBuilder(myProject); + myPopupBuilder.setPlainView(true); + + myComboBoxAction = new ComboBoxAction() { + + @Override + public void update(AnActionEvent e) { + final Presentation presentation = e.getPresentation(); + updatePresentation(presentation, BreakpointChooser.this.myBreakpointItem); + } + + @Override + protected ComboBoxButton createComboBoxButton(final Presentation presentation) { + return new ComboBoxButton(presentation) { + @Override + protected JBPopup createPopup(final Runnable onDispose) { + final DetailView.PreviewEditorState pushed = myDetailView.getEditorState(); + myPopupBuilder.setIsViewer(true); + myPopupBuilder.setAddDetailViewToEast(false); + myPopupBuilder.setDetailView(new MyDetailView(pushed)); + myPopupBuilder.setCallback(new BreakpointMasterDetailPopupBuilder.BreakpointChosenCallback() { + @Override + public void breakpointChosen(Project project, BreakpointItem breakpointItem, JBPopup popup) { + popup.cancel(); + myBreakpointItem = breakpointItem; + mySelectedBreakpoint = breakpointItem.getBreakpoint(); + updatePresentation(myComboBoxAction.getTemplatePresentation(), myBreakpointItem); + updatePresentation(presentation, myBreakpointItem); + + if (myDelegate != null) { + myDelegate.breakpointChosen(project, breakpointItem, popup); + } + } + }); + myPopupBuilder.setIsViewer(true); + JBPopup popup = myPopupBuilder.createPopup(); + popup.addListener(new JBPopupListener() { + @Override + public void beforeShown(LightweightWindowEvent event) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void onClosed(LightweightWindowEvent event) { + onDispose.run(); + pop(pushed); + } + }); + return popup; + } + + + }; + } + + @NotNull + @Override + protected DefaultActionGroup createPopupActionGroup(JComponent button) { + assert false : "should not be here"; + return null; + } + }; + + myActionToolbar = ActionManager.getInstance().createActionToolbar("asdad", new DefaultActionGroup(myComboBoxAction), true); + + } + + public void setBreakpointItems(Collection items) { + myPopupBuilder.setBreakpointItems(items); + } + + private void updatePresentation(Presentation presentation, BreakpointItem breakpointItem) { + if (breakpointItem != null) { + presentation.setIcon(breakpointItem.getIcon()); + presentation.setText(breakpointItem.getDisplayText()); + } + else { + presentation.setText(DebuggerBundle.message("value.none")); + } + + } + + public JComponent getComponent() { + return myActionToolbar.getComponent(); + } + + private class MyDetailView implements DetailView { + + private final PreviewEditorState myPushed; + + public MyDetailView(PreviewEditorState pushed) { + myPushed = pushed; + } + + @Override + public Editor getEditor() { + return myDetailView.getEditor(); + } + + @Override + public void navigateInPreviewEditor(PreviewEditorState editorState) { + if (myDetailView != null) { + myDetailView.navigateInPreviewEditor(editorState); + } + } + + @Override + public JPanel getDetailPanel() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setDetailPanel(@Nullable JPanel panel) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void clearEditor() { + pop(myPushed); + } + + @Override + public PreviewEditorState getEditorState() { + return myDetailView.getEditorState(); + } + + @Override + public T getUserData(@NotNull Key key) { + return myDetailView.getUserData(key); + } + + @Override + public void putUserData(@NotNull Key key, @Nullable T value) { + myDetailView.putUserData(key, value); + } + } +} diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointPropertiesPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointPropertiesPanel.java index 9dea6960a3ac..ce2bc0a5a938 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointPropertiesPanel.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointPropertiesPanel.java @@ -20,7 +20,6 @@ */ package com.intellij.debugger.ui.breakpoints; -import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.DebuggerManagerEx; import com.intellij.debugger.InstanceFilter; import com.intellij.debugger.engine.evaluation.CodeFragmentKind; @@ -30,12 +29,12 @@ import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.debugger.ui.CompletionEditor; import com.intellij.debugger.ui.DebuggerExpressionComboBox; import com.intellij.debugger.ui.DebuggerStatementEditor; -import com.intellij.ui.ListCellRendererWrapper; +import com.intellij.debugger.ui.JavaDebuggerSupport; import com.intellij.ide.util.ClassFilter; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.FixedSizeButton; +import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; @@ -44,7 +43,10 @@ import com.intellij.psi.PsiElement; import com.intellij.ui.FieldPanel; import com.intellij.ui.MultiLineTooltipUI; import com.intellij.ui.components.JBCheckBox; +import com.intellij.ui.popup.util.DetailView; import com.intellij.util.IJSwingUtilities; +import com.intellij.xdebugger.breakpoints.ui.BreakpointItem; +import com.intellij.xdebugger.impl.DebuggerSupport; import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -58,6 +60,16 @@ import java.util.Iterator; import java.util.List; public abstract class BreakpointPropertiesPanel { + + private final BreakpointChooser myMasterBreakpointChooser; + + public void setDetailView(DetailView detailView) { + myDetailView = detailView; + myMasterBreakpointChooser.setDetailView(detailView); + } + + private DetailView myDetailView; + protected final Project myProject; private final Key myBreakpointCategory; private boolean myCompact; @@ -104,7 +116,6 @@ public abstract class BreakpointPropertiesPanel { ButtonGroup mySuspendPolicyGroup; @NonNls public static final String CONTROL_LOG_MESSAGE = "logMessage"; - private BreakpointComboboxHandler myBreakpointComboboxHandler; private static final int MAX_COMBO_WIDTH = 300; private final FixedSizeButton myConditionMagnifierButton; private boolean myMoreOptionsVisible = true; @@ -139,6 +150,10 @@ public abstract class BreakpointPropertiesPanel { }; } + public DetailView getDetailView() { + return myDetailView; + } + public interface Delegate { void showActionsPanel(); @@ -153,10 +168,6 @@ public abstract class BreakpointPropertiesPanel { } public void dispose() { - if (myBreakpointComboboxHandler != null) { - myBreakpointComboboxHandler.dispose(); - myBreakpointComboboxHandler = null; - } if (myConditionCombo != null) { myConditionCombo.dispose(); } @@ -212,7 +223,7 @@ public abstract class BreakpointPropertiesPanel { panel.add(component, BorderLayout.CENTER); } - public BreakpointPropertiesPanel(Project project, final Key breakpointCategory, boolean compact) { + public BreakpointPropertiesPanel(final Project project, final Key breakpointCategory, boolean compact) { myProject = project; myBreakpointCategory = breakpointCategory; myCompact = compact; @@ -226,7 +237,7 @@ public abstract class BreakpointPropertiesPanel { public void itemStateChanged(final ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { final String defaultPolicy = - DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager().getDefaultSuspendPolicy(breakpointCategory); + getBreakpointManager(myProject).getDefaultSuspendPolicy(breakpointCategory); myMakeDefaultButton.setEnabled(!defaultPolicy.equals(getSelectedSuspendPolicy())); } } @@ -247,7 +258,7 @@ public abstract class BreakpointPropertiesPanel { myMakeDefaultButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { - final BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager(); + final BreakpointManager breakpointManager = getBreakpointManager(myProject); final String suspendPolicy = getSelectedSuspendPolicy(); breakpointManager.setDefaultSuspendPolicy(breakpointCategory, suspendPolicy); updateSuspendPolicyRbFont(); @@ -272,20 +283,25 @@ public abstract class BreakpointPropertiesPanel { } myLogExpressionCombo = new DebuggerExpressionComboBox(project, "LineBreakpoint logMessage"); - - final ComboBox baseBreakpointCombo = new ComboBox(100); - myBreakpointComboboxHandler = new BreakpointComboboxHandler(myProject, baseBreakpointCombo); - baseBreakpointCombo.setRenderer(new BreakpointComboRenderer(baseBreakpointCombo.getRenderer())); - baseBreakpointCombo.addItemListener(new ItemListener() { - public void itemStateChanged(final ItemEvent e) { - ComboboxItem item = (ComboboxItem)baseBreakpointCombo.getSelectedItem(); + myMasterBreakpointChooser = new BreakpointChooser(project, new BreakpointChooser.Delegate() { + @Override + public void breakpointChosen(Project project, BreakpointItem item, JBPopup popup) { final boolean enabled = item != null && item.getBreakpoint() != null; myLeaveEnabledRadioButton.setEnabled(enabled); myDisableAgainRadio.setEnabled(enabled); myEnableOrDisableLabel.setEnabled(enabled); + + if (item != null) { + + saveMasterBreakpoint(); + } + + updateMasterBreakpointPanel(findMasterBreakpointRule()); + } }); + myInstanceFiltersField = new FieldPanel(new MyTextField(), "", null, new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -341,7 +357,8 @@ public abstract class BreakpointPropertiesPanel { insert(myConditionComboPanel, conditionPanel); insert(myLogExpressionComboPanel, myLogExpressionCombo); - insert(myDependentBreakpointComboPanel, baseBreakpointCombo); + //insert(myDependentBreakpointComboPanel, baseBreakpointCombo); + insert(myDependentBreakpointComboPanel, myMasterBreakpointChooser.getComponent()); insert(myInstanceFiltersFieldPanel, myInstanceFiltersField); insert(myClassFiltersFieldPanel, myClassFiltersField); @@ -364,6 +381,51 @@ public abstract class BreakpointPropertiesPanel { IJSwingUtilities.adjustComponentsOnMac(myLogMessageCheckBox); } + private List getBreakpointItemsExceptMy() { + List items = new ArrayList(); + findJavaDebuggerSupport().getBreakpointPanelProvider().provideBreakpointItems(myProject, items); + for (BreakpointItem item : items) { + if (item.getBreakpoint() == myBreakpoint) { + items.remove(item); + break; + } + } + return items; + } + + private DebuggerSupport findJavaDebuggerSupport() { + DebuggerSupport[] supports = DebuggerSupport.getDebuggerSupports(); + DebuggerSupport support = null; + for (DebuggerSupport s : supports) { + if (s instanceof JavaDebuggerSupport) { + support = s; + } + } + return support; + } + + private void saveMasterBreakpoint() { + + + Breakpoint masterBreakpoint = (Breakpoint)myMasterBreakpointChooser.getSelectedBreakpoint(); + if (masterBreakpoint == null) { + getBreakpointManager(myProject).removeBreakpointRule(myBreakpoint); + } + else { + EnableBreakpointRule rule = findMasterBreakpointRule(); + boolean selected = myLeaveEnabledRadioButton.isSelected(); + if (rule != null && (rule.getMasterBreakpoint() != masterBreakpoint || rule.isLeaveEnabled() != selected ) ) { + getBreakpointManager(myProject).removeBreakpointRule(rule); + + } + getBreakpointManager(myProject).addBreakpointRule(new EnableBreakpointRule(getBreakpointManager(myProject), + masterBreakpoint, + myBreakpoint, + selected)); + } + + } + private String getSelectedSuspendPolicy() { if (!mySuspendJBCheckBox.isSelected()) { return DebuggerSettings.SUSPEND_NONE; @@ -375,7 +437,7 @@ public abstract class BreakpointPropertiesPanel { } private void updateSuspendPolicyRbFont() { - final String defPolicy = DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager().getDefaultSuspendPolicy(myBreakpointCategory); + final String defPolicy = getBreakpointManager(myProject).getDefaultSuspendPolicy(myBreakpointCategory); final Font font = mySuspendAllRadio.getFont().deriveFont(Font.PLAIN); final Font boldFont = font.deriveFont(Font.BOLD); @@ -410,7 +472,9 @@ public abstract class BreakpointPropertiesPanel { myBreakpoint = breakpoint; boolean moreOptionsVisible = moreOptionsVisible1; boolean actionsPanelVisible = moreOptionsVisible1; - myBreakpointComboboxHandler.initFrom(breakpoint); + + initMasterBreakpointPanel(); + if (breakpoint.COUNT_FILTER > 0) { myPassCountField.setText(Integer.toString(breakpoint.COUNT_FILTER)); moreOptionsVisible = true; @@ -504,6 +568,31 @@ public abstract class BreakpointPropertiesPanel { setMoreOptionsVisible(moreOptionsVisible); } + private void initMasterBreakpointPanel() { + myMasterBreakpointChooser.setBreakpointItems(getBreakpointItemsExceptMy()); + + final EnableBreakpointRule rule = findMasterBreakpointRule(); + + final Breakpoint baseBreakpoint = rule != null ? rule.getMasterBreakpoint() : null; + updateMasterBreakpointPanel(rule); + + myMasterBreakpointChooser.setSelectedBreakpoint(baseBreakpoint); + } + + private @Nullable EnableBreakpointRule findMasterBreakpointRule() { + return myBreakpoint != null? getBreakpointManager(myProject).findBreakpointRule(myBreakpoint) : null; + } + + private void updateMasterBreakpointPanel(@Nullable EnableBreakpointRule rule) { + final boolean leaveEnabled = rule != null && rule.isLeaveEnabled(); + if (leaveEnabled) { + myLeaveEnabledRadioButton.setSelected(true); + } + else { + myDisableAgainRadio.setSelected(true); + } + } + private TextWithImportsImpl emptyText() { return new TextWithImportsImpl(CodeFragmentKind.EXPRESSION, ""); } @@ -512,7 +601,8 @@ public abstract class BreakpointPropertiesPanel { * Save values in the UI components to the breakpoint object */ public void saveTo(Breakpoint breakpoint, @NotNull Runnable afterUpdate) { - myBreakpointComboboxHandler.saveTo(breakpoint, myLeaveEnabledRadioButton.isSelected()); + + saveMasterBreakpoint(); try { String text = myPassCountField.getText().trim(); int count = !"".equals(text)? Integer.parseInt(text) : 0; @@ -702,37 +792,6 @@ public abstract class BreakpointPropertiesPanel { public JPanel getPanel() { return myPanel; } - - private static class BreakpointComboboxModel extends DefaultComboBoxModel { - private final ComboboxItem[] myItems; - - public BreakpointComboboxModel(Breakpoint[] breakpoints) { - myItems = new ComboboxItem[breakpoints.length + 1]; - myItems[0] = new ComboboxItem(); - for (int idx = 0; idx < breakpoints.length; idx++) { - myItems[idx + 1] = new ComboboxItem(breakpoints[idx]); - } - } - - public int getSize() { - return myItems.length; - } - - public ComboboxItem getElementAt(int index) { - return myItems[index]; - } - - public void selectBreakpoint(Breakpoint breakpoint) { - for (final ComboboxItem item : myItems) { - if (breakpoint == null ? item.getBreakpoint() == null : breakpoint.equals(item.getBreakpoint())) { - if (!item.equals(getSelectedItem())) { - setSelectedItem(item); - } - break; - } - } - } - } private static class ComboboxItem { private final Breakpoint breakpoint; @@ -764,83 +823,9 @@ public abstract class BreakpointPropertiesPanel { return breakpoint != null ? breakpoint.hashCode() : 0; } } - - private class BreakpointComboboxHandler implements BreakpointManagerListener{ - private final JComboBox myCombo; - private final BreakpointManager myBreakpointManager; - private Breakpoint myCurrentBreakpoint = null; - public BreakpointComboboxHandler(final Project project, final JComboBox breakpointCombo) { - myCombo = breakpointCombo; - myBreakpointManager = DebuggerManagerEx.getInstanceEx(project).getBreakpointManager(); - myBreakpointManager.addBreakpointManagerListener(this); - } - - public void initFrom(Breakpoint breakpoint) { - myCurrentBreakpoint = breakpoint; - fillCombobox(); - } - - public void saveTo(Breakpoint slaveBreakpoint, final boolean leaveEnabled) { - myBreakpointManager.removeBreakpointRule(slaveBreakpoint); - final Breakpoint masterBreakpoint = ((ComboboxItem)myCombo.getSelectedItem()).getBreakpoint(); - if (masterBreakpoint != null) { - myBreakpointManager.addBreakpointRule(new EnableBreakpointRule(myBreakpointManager, masterBreakpoint, slaveBreakpoint, leaveEnabled)); - } - } - - public void breakpointsChanged() { - fillCombobox(); - } - - public void dispose() { - myBreakpointManager.removeBreakpointManagerListener(this); - } - - private void fillCombobox() { - final List breakpoints = new ArrayList(myBreakpointManager.getBreakpoints()); - if (myCurrentBreakpoint != null) { - // avoid depending on itself - breakpoints.remove(myCurrentBreakpoint); - } - myCombo.setModel(new BreakpointComboboxModel(breakpoints.toArray(new Breakpoint[breakpoints.size()]))); - final EnableBreakpointRule rule = myCurrentBreakpoint != null? myBreakpointManager.findBreakpointRule(myCurrentBreakpoint) : null; - final Breakpoint baseBreakpoint = rule != null? rule.getMasterBreakpoint() : null; - final boolean leaveEnabled = rule != null && rule.isLeaveEnabled(); - if (leaveEnabled) { - myLeaveEnabledRadioButton.setSelected(true); - } - else { - myDisableAgainRadio.setSelected(true); - } - ((BreakpointComboboxModel)myCombo.getModel()).selectBreakpoint(baseBreakpoint); - } - } - - private static class BreakpointComboRenderer extends ListCellRendererWrapper { - public BreakpointComboRenderer(final ListCellRenderer listCellRenderer) { - super(listCellRenderer); - } - - @Override - public void customize(JList list, Object value, int index, boolean selected, boolean hasFocus) { - Breakpoint breakpoint = ((ComboboxItem)value).getBreakpoint(); - final String text = breakpoint != null ? index == -1 ? breakpoint.getShortName() : breakpoint.getDisplayName() : DebuggerBundle.message("value.none"); - setText(text); - - final Icon icon; - if (breakpoint != null) { - icon = breakpoint instanceof BreakpointWithHighlighter - ? breakpoint.ENABLED - ? ((BreakpointWithHighlighter)breakpoint).getSetIcon(false) - : ((BreakpointWithHighlighter)breakpoint).getDisabledIcon(false) - : breakpoint.getIcon(); - } - else { - icon = null; - } - setIcon(icon); - } + private BreakpointManager getBreakpointManager(Project project) { + return DebuggerManagerEx.getInstanceEx(project).getBreakpointManager(); } private static class MagnifierButtonAction implements ActionListener { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java index a186926b531b..170eec164c2f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java @@ -23,6 +23,7 @@ import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleTextAttributes; import com.intellij.ui.popup.util.DetailView; import com.intellij.xdebugger.breakpoints.ui.BreakpointItem; +import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -37,17 +38,29 @@ class JavaBreakpointItem extends BreakpointItem { private final Breakpoint myBreakpoint; private BreakpointFactory myBreakpointFactory; - public JavaBreakpointItem(BreakpointFactory breakpointFactory, Breakpoint breakpoint) { + public JavaBreakpointItem(@Nullable BreakpointFactory breakpointFactory, Breakpoint breakpoint) { myBreakpointFactory = breakpointFactory; myBreakpoint = breakpoint; } @Override - protected void setupGenericRenderer(SimpleColoredComponent renderer) { - //renderer.setIcon(myBreakpoint.getIcon()); + protected void setupGenericRenderer(SimpleColoredComponent renderer, boolean plainView) { + if (plainView) { + renderer.setIcon(myBreakpoint.getIcon()); + } renderer.append(myBreakpoint.getShortName(), isEnabled() ? SimpleTextAttributes.REGULAR_ATTRIBUTES : SimpleTextAttributes.GRAY_ATTRIBUTES); } + @Override + public Icon getIcon() { + return myBreakpoint.getIcon(); + } + + @Override + public String getDisplayText() { + return myBreakpoint.getDisplayName(); + } + @Override public String speedSearchText() { return myBreakpoint.getDisplayName(); @@ -59,11 +72,12 @@ class JavaBreakpointItem extends BreakpointItem { } @Override - public void updateDetailView(DetailView panel) { - BreakpointPropertiesPanel breakpointPropertiesPanel = myBreakpointFactory - .createBreakpointPropertiesPanel(myBreakpoint.getProject(), false); + protected void doUpdateDetailView(DetailView panel) { + BreakpointPropertiesPanel breakpointPropertiesPanel = myBreakpointFactory != null ? myBreakpointFactory + .createBreakpointPropertiesPanel(myBreakpoint.getProject(), false) : null; if (breakpointPropertiesPanel != null) { breakpointPropertiesPanel.setSaveOnRemove(true); + breakpointPropertiesPanel.setDetailView(panel); } if (breakpointPropertiesPanel != null) { @@ -86,7 +100,7 @@ class JavaBreakpointItem extends BreakpointItem { @Override public boolean allowedToRemove() { - return myBreakpointFactory.breakpointCanBeRemoved(myBreakpoint); + return myBreakpointFactory != null && myBreakpointFactory.breakpointCanBeRemoved(myBreakpoint); } @Override diff --git a/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java b/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java index f065366ab209..c195f9789f62 100644 --- a/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java +++ b/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java @@ -18,6 +18,7 @@ package com.intellij.ui.popup.util; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.util.UserDataHolder; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.Nullable; @@ -30,16 +31,75 @@ import javax.swing.*; * Time: 5:34 AM * To change this template use File | Settings | File Templates. */ -public interface DetailView { - void updateWithItem(ItemWrapper wrapper); +public interface DetailView extends UserDataHolder { Editor getEditor(); - void navigateInPreviewEditor(VirtualFile file, LogicalPosition positionToNavigate, TextAttributes lineAttributes); + void navigateInPreviewEditor(PreviewEditorState editorState); JPanel getDetailPanel(); void setDetailPanel(@Nullable JPanel panel); void clearEditor(); + + PreviewEditorState getEditorState(); + + class PreviewEditorState { + + public static PreviewEditorState EMPTY = new PreviewEditorState(null, null, null); + + public static PreviewEditorState create(VirtualFile file, int line) { + return new PreviewEditorState(file, new LogicalPosition(line, 0), null); + } + + public static PreviewEditorState create(VirtualFile file, int line, TextAttributes attributes) { + return new PreviewEditorState(file, new LogicalPosition(line, 0), attributes); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + PreviewEditorState state = (PreviewEditorState)o; + + if (myAttributes != null ? !myAttributes.equals(state.myAttributes) : state.myAttributes != null) return false; + if (myFile != null ? !myFile.equals(state.myFile) : state.myFile != null) return false; + if (myNavigate != null ? !myNavigate.equals(state.myNavigate) : state.myNavigate != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = myFile != null ? myFile.hashCode() : 0; + result = 31 * result + (myNavigate != null ? myNavigate.hashCode() : 0); + result = 31 * result + (myAttributes != null ? myAttributes.hashCode() : 0); + return result; + } + + public VirtualFile getFile() { + return myFile; + } + + public LogicalPosition getNavigate() { + return myNavigate; + } + + public TextAttributes getAttributes() { + return myAttributes; + } + + private final VirtualFile myFile; + private final LogicalPosition myNavigate; + private final TextAttributes myAttributes; + + public PreviewEditorState(VirtualFile file, LogicalPosition navigate, TextAttributes attributes) { + + myFile = file; + myNavigate = navigate; + myAttributes = attributes; + } + } } diff --git a/platform/lang-api/src/com/intellij/ui/popup/util/ItemWrapper.java b/platform/lang-api/src/com/intellij/ui/popup/util/ItemWrapper.java index a84bac7f454d..c1c4d0bcc221 100644 --- a/platform/lang-api/src/com/intellij/ui/popup/util/ItemWrapper.java +++ b/platform/lang-api/src/com/intellij/ui/popup/util/ItemWrapper.java @@ -16,20 +16,12 @@ package com.intellij.ui.popup.util; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.ui.ColoredListCellRenderer; import com.intellij.ui.ColoredTreeCellRenderer; import org.jetbrains.annotations.Nullable; import javax.swing.*; -/** -* Created with IntelliJ IDEA. -* User: zajac -* Date: 5/6/12 -* Time: 2:05 AM -* To change this template use File | Settings | File Templates. -*/ public interface ItemWrapper { void setupRenderer(ColoredListCellRenderer renderer, Project project, boolean selected); @@ -37,8 +29,6 @@ public interface ItemWrapper { void updateAccessoryView(JComponent label); - void execute(Project project, JBPopup popup); - String speedSearchText(); @Nullable diff --git a/platform/lang-api/src/com/intellij/ui/popup/util/SplitterItem.java b/platform/lang-api/src/com/intellij/ui/popup/util/SplitterItem.java index 4c038b103861..1b3bf2bd64cc 100644 --- a/platform/lang-api/src/com/intellij/ui/popup/util/SplitterItem.java +++ b/platform/lang-api/src/com/intellij/ui/popup/util/SplitterItem.java @@ -56,11 +56,6 @@ public class SplitterItem implements ItemWrapper { //To change body of implemented methods use File | Settings | File Templates. } - @Override - public void execute(Project project, JBPopup popup) { - //To change body of implemented methods use File | Settings | File Templates. - } - @Override public String speedSearchText() { return ""; //To change body of implemented methods use File | Settings | File Templates. diff --git a/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkItem.java b/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkItem.java index 68151a1dfc01..75d3dd2da9fa 100644 --- a/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkItem.java +++ b/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkItem.java @@ -15,11 +15,9 @@ */ package com.intellij.ide.bookmarks; -import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.markup.EffectType; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.util.Iconable; import com.intellij.openapi.vcs.FileStatus; import com.intellij.openapi.vcs.FileStatusManager; @@ -110,22 +108,17 @@ public class BookmarkItem implements ItemWrapper { return myBookmark.getFile().getName() + " " + myBookmark.getDescription(); } - public void execute(Project project, JBPopup popup) { - popup.cancel(); - myBookmark.navigate(); - popup.cancel(); - } - public String footerText() { return myBookmark.getFile().getPresentableUrl(); } @Override public void updateDetailView(final DetailView panel) { - VirtualFile file = myBookmark.getFile(); - LogicalPosition positionToNavigate = new LogicalPosition(myBookmark.getLine(), 0); + doUpdateDetailView(panel); + } - panel.navigateInPreviewEditor(file, positionToNavigate, null); + private void doUpdateDetailView(DetailView panel) { + panel.navigateInPreviewEditor(DetailView.PreviewEditorState.create(myBookmark.getFile(), myBookmark.getLine())); } @Override diff --git a/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java b/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java index 70875e35aa49..4e513fad4c78 100644 --- a/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java +++ b/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java @@ -23,7 +23,8 @@ import com.intellij.ide.bookmarks.Bookmark; import com.intellij.ide.bookmarks.BookmarkItem; import com.intellij.ide.bookmarks.BookmarkManager; import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.editor.*; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; @@ -32,6 +33,8 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.ui.components.JBList; +import com.intellij.ui.popup.util.DetailViewImpl; +import com.intellij.ui.popup.util.ItemWrapper; import com.intellij.ui.popup.util.MasterDetailPopupBuilder; import com.intellij.ui.speedSearch.FilteringListModel; import org.jetbrains.annotations.Nullable; @@ -121,6 +124,15 @@ public class BookmarksAction extends AnAction implements DumbAware, MasterDetail return new Object[0]; //To change body of implemented methods use File | Settings | File Templates. } + @Override + public void itemChosen(ItemWrapper item, Project project, JBPopup popup) { + if (item instanceof BookmarkItem) { + Bookmark bookmark = ((BookmarkItem)item).getBookmark(); + popup.cancel(); + bookmark.navigate(); + } + } + private static DefaultListModel buildModel(Project project) { final DefaultListModel model = new DefaultListModel(); diff --git a/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java b/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java index 4327addc74c9..494b1d649b3d 100644 --- a/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java @@ -26,8 +26,12 @@ import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.UserDataHolder; +import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.components.JBScrollPane; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -40,7 +44,7 @@ import java.awt.*; * Time: 2:04 AM * To change this template use File | Settings | File Templates. */ -public class DetailViewImpl extends JPanel implements DetailView { +public class DetailViewImpl extends JPanel implements DetailView, UserDataHolder { private final Project myProject; private Editor myEditor; private ItemWrapper myWrapper; @@ -51,6 +55,7 @@ public class DetailViewImpl extends JPanel implements DetailView { private JLabel myNothingToShow = new JLabel("Nothing to show"); private JLabel myNothingToShowInEditor = new JLabel("Nothing to show"); private RangeHighlighter myHighlighter; + private PreviewEditorState myEditorState = PreviewEditorState.EMPTY; public DetailViewImpl(Project project) { super(new BorderLayout()); @@ -60,34 +65,24 @@ public class DetailViewImpl extends JPanel implements DetailView { myNothingToShowInEditor.setHorizontalAlignment(JLabel.CENTER); } - @Override - public void updateWithItem(ItemWrapper wrapper) { - if (myWrapper != wrapper) { - myWrapper = wrapper; - if (wrapper != null) { - wrapper.updateDetailView(this); - } - else { - clearEditor(); - repaint(); - } - - revalidate(); - } - } - @Override public void clearEditor() { if (getEditor() != null) { clearHightlighting(); remove(getEditor().getComponent()); EditorFactory.getInstance().releaseEditor(getEditor()); + myEditorState = PreviewEditorState.EMPTY; setEditor(null); add(myNothingToShowInEditor, BorderLayout.CENTER); repaint(); } } + @Override + public PreviewEditorState getEditorState() { + return myEditorState; + } + @Override public void removeNotify() { super.removeNotify(); @@ -104,7 +99,12 @@ public class DetailViewImpl extends JPanel implements DetailView { } @Override - public void navigateInPreviewEditor(VirtualFile file, LogicalPosition positionToNavigate, @Nullable TextAttributes lineAttributes) { + public void navigateInPreviewEditor(PreviewEditorState editorState) { + myEditorState = editorState; + + final VirtualFile file = editorState.getFile(); + final LogicalPosition positionToNavigate = editorState.getNavigate(); + final TextAttributes lineAttributes = editorState.getAttributes(); Document document = FileDocumentManager.getInstance().getDocument(file); Project project = myProject; @@ -134,10 +134,9 @@ public class DetailViewImpl extends JPanel implements DetailView { getEditor().getScrollingModel().scrollToCaret(ScrollType.CENTER); clearHightlighting(); - if (lineAttributes != null){ + if (lineAttributes != null) { myHighlighter = getEditor().getMarkupModel().addLineHighlighter(positionToNavigate.line, HighlighterLayer.SELECTION - 1, lineAttributes); - } } else { @@ -188,4 +187,16 @@ public class DetailViewImpl extends JPanel implements DetailView { } myDetailPanel = panel; } + + final UserDataHolderBase myDataHolderBase = new UserDataHolderBase(); + + @Override + public T getUserData(@NotNull Key key) { + return myDataHolderBase.getUserData(key); + } + + @Override + public void putUserData(@NotNull Key key, @Nullable T value) { + myDataHolderBase.putUserData(key, value); + } } diff --git a/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java b/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java index 257197ead096..de8a4ae7408b 100644 --- a/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java +++ b/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java @@ -20,6 +20,8 @@ import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.ActionToolbar; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopup; +import com.intellij.openapi.ui.popup.JBPopupListener; +import com.intellij.openapi.ui.popup.LightweightWindowEvent; import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.ColoredListCellRenderer; @@ -42,13 +44,6 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; -/** - * Created with IntelliJ IDEA. - * User: zajac - * Date: 5/6/12 - * Time: 2:06 PM - * To change this template use File | Settings | File Templates. - */ public class MasterDetailPopupBuilder { private static final Color BORDER_COLOR = Gray._135; @@ -57,26 +52,27 @@ public class MasterDetailPopupBuilder { private Delegate myDelegate; private boolean myCloseOnEnter; - public DetailViewImpl getDetailView() { - return myDetailView; - } + private DetailView myDetailView; - private DetailViewImpl myDetailView; private JLabel myPathLabel; + private JBPopup myPopup; private Alarm myUpdateAlarm; - - private JComponent myChooserComponent; + private ActionToolbar myActionToolbar; + private boolean myAddDetailViewToEast; + + + public MasterDetailPopupBuilder setDetailView(DetailView detailView) { + myDetailView = detailView; + return this; + } public ActionToolbar getActionToolbar() { return myActionToolbar; } - private ActionToolbar myActionToolbar; - public MasterDetailPopupBuilder(Project project) { - myProject = project; } @@ -106,11 +102,20 @@ public class MasterDetailPopupBuilder { myUpdateAlarm.cancelAllRequests(); myUpdateAlarm.addRequest(new Runnable() { public void run() { - myDetailView.updateWithItem(wrapper1); + doUpdateDetailViewWithItem(wrapper1); } }, 100); } + protected void doUpdateDetailViewWithItem(ItemWrapper wrapper1) { + if (wrapper1 != null) { + wrapper1.updateDetailView(myDetailView); + } + else { + myDetailView.clearEditor(); + } + } + public JBPopup createMasterDetailPopup() { setupRenderer(); @@ -122,7 +127,10 @@ public class MasterDetailPopupBuilder { myPathLabel.setFont(font.deriveFont((float)10)); myUpdateAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD); - myDetailView = new DetailViewImpl(myProject); + + if (myDetailView == null) { + myDetailView = new DetailViewImpl(myProject); + } JPanel footerPanel = new JPanel(new BorderLayout()) { @Override @@ -139,14 +147,13 @@ public class MasterDetailPopupBuilder { IdeFocusManager.getInstance(myProject).doWhenFocusSettlesDown(new Runnable() { public void run() { Object[] values = getSelectedItems(); - if (values.length == 1) { - ((ItemWrapper)values[0]).execute(myProject, myPopup); + myDelegate.itemChosen((ItemWrapper)values[0], myProject, myPopup); } else { for (Object value : values) { if (value instanceof ItemWrapper) { - ((ItemWrapper)value).execute(myProject, myPopup); + myDelegate.itemChosen((ItemWrapper)value, myProject, myPopup); } } } @@ -158,21 +165,34 @@ public class MasterDetailPopupBuilder { footerPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); footerPanel.add(myPathLabel); - myActionToolbar = ActionManager.getInstance().createActionToolbar("", myActions, true); - myActionToolbar.setReservePlaceAutoPopupIcon(false); - myActionToolbar.setMinimumButtonSize(new Dimension(20, 20)); - final JComponent toolBar = myActionToolbar.getComponent(); - toolBar.setOpaque(false); + JComponent toolBar = null; + if (myActions != null) { + myActionToolbar = ActionManager.getInstance().createActionToolbar("", myActions, true); + myActionToolbar.setReservePlaceAutoPopupIcon(false); + myActionToolbar.setMinimumButtonSize(new Dimension(20, 20)); + toolBar = myActionToolbar.getComponent(); + toolBar.setOpaque(false); + } - final PopupChooserBuilder builder = createInnerBuilder(); - myPopup = builder. - setTitle(myDelegate.getTitle()). + final PopupChooserBuilder builder = createInnerBuilder(). setMovable(true). setResizable(true). setAutoselectOnMouseMove(false). setSettingButton(toolBar). - setSouthComponent(footerPanel). - setEastComponent(myDetailView). + setSouthComponent(footerPanel); + + if (myAddDetailViewToEast) { + builder. + setEastComponent((JComponent)myDetailView); + } + + String title = myDelegate.getTitle(); + if (title != null) { + builder.setTitle(title); + } + + + builder. setItemChoosenCallback(runnable). setCloseOnEnter(myCloseOnEnter). setMayBeParent(true). @@ -181,7 +201,20 @@ public class MasterDetailPopupBuilder { public String fun(Object o) { return ((ItemWrapper)o).speedSearchText(); } - }).createPopup(); + }); + + myPopup = builder.createPopup(); + myPopup.addListener(new JBPopupListener() { + @Override + public void beforeShown(LightweightWindowEvent event) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void onClosed(LightweightWindowEvent event) { + myDetailView.clearEditor(); + } + }); return myPopup; } @@ -214,11 +247,16 @@ public class MasterDetailPopupBuilder { private void updateDetailViewLater() { //noinspection SSBasedInspection - SwingUtilities.invokeLater(new Runnable() { - public void run() { - doUpdateDetailView(); - } - }); + //SwingUtilities.invokeLater(new Runnable() { + // public void run() { + // doUpdateDetailView(); + // } + //}); + doUpdateDetailView(); + } + + public void setAddDetailViewToEast(boolean addDetailViewToEast) { + myAddDetailViewToEast = addDetailViewToEast; } public static boolean allowedToRemoveItems(Object[] values) { @@ -271,7 +309,7 @@ public class MasterDetailPopupBuilder { } } - public MasterDetailPopupBuilder setActionsGroup(ActionGroup actions) { + public MasterDetailPopupBuilder setActionsGroup(@Nullable ActionGroup actions) { myActions = actions; return this; } @@ -332,6 +370,7 @@ public class MasterDetailPopupBuilder { } public interface Delegate { + @Nullable String getTitle(); void handleMnemonic(KeyEvent e, Project project, JBPopup popup); @@ -340,6 +379,8 @@ public class MasterDetailPopupBuilder { JComponent createAccessoryView(Project project); Object[] getSelectedItemsInTree(); + + void itemChosen(ItemWrapper item, Project project, JBPopup popup); } public static class ListItemRenderer extends JPanel implements ListCellRenderer { diff --git a/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java b/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java index 5034dddbc5c7..249c8321b92b 100644 --- a/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java +++ b/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java @@ -18,6 +18,7 @@ package com.intellij.openapi.actionSystem.ex; import com.intellij.icons.AllIcons; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.util.IconLoader; @@ -160,7 +161,7 @@ public abstract class ComboBoxAction extends AnAction implements CustomComponent } }; - ListPopup popup = createPopup(onDispose); + JBPopup popup = createPopup(onDispose); popup.show(new RelativePoint(this, new Point(0, this.getHeight() - 1))); } @@ -171,7 +172,7 @@ public abstract class ComboBoxAction extends AnAction implements CustomComponent return myForcePressed ? null : super.getToolTipText(); } - protected ListPopup createPopup(Runnable onDispose) { + protected JBPopup createPopup(Runnable onDispose) { DefaultActionGroup group = createPopupActionGroup(this); DataContext context = getDataContext(); diff --git a/platform/platform-api/src/com/intellij/openapi/ui/popup/ListPopup.java b/platform/platform-api/src/com/intellij/openapi/ui/popup/ListPopup.java index 86ff18f455ad..df8c5b042043 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/popup/ListPopup.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/popup/ListPopup.java @@ -16,6 +16,7 @@ package com.intellij.openapi.ui.popup; +import javax.swing.event.ListSelectionListener; import java.awt.event.InputEvent; /** @@ -52,4 +53,5 @@ public interface ListPopup extends JBPopup { */ void setHandleAutoSelectionBeforeShow(boolean autoHandle); + void addListSelectionListener(ListSelectionListener listSelectionListener); } diff --git a/platform/platform-api/src/com/intellij/ui/ColoredTreeCellRenderer.java b/platform/platform-api/src/com/intellij/ui/ColoredTreeCellRenderer.java index 73122be7dae5..afb002e73bb5 100644 --- a/platform/platform-api/src/com/intellij/ui/ColoredTreeCellRenderer.java +++ b/platform/platform-api/src/com/intellij/ui/ColoredTreeCellRenderer.java @@ -41,8 +41,8 @@ public abstract class ColoredTreeCellRenderer extends SimpleColoredComponent imp protected boolean myFocused; protected JTree myTree; - private boolean myOpaque = true; + private boolean myOpaque = true; public final Component getTreeCellRendererComponent( JTree tree, Object value, @@ -122,6 +122,10 @@ public abstract class ColoredTreeCellRenderer extends SimpleColoredComponent imp return this; } + public JTree getTree() { + return myTree; + } + protected boolean isFocused() { return myTree.hasFocus(); } diff --git a/platform/platform-impl/src/com/intellij/ui/popup/list/ListPopupImpl.java b/platform/platform-impl/src/com/intellij/ui/popup/list/ListPopupImpl.java index ba29b515cea4..29455c59589b 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/list/ListPopupImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/list/ListPopupImpl.java @@ -364,6 +364,7 @@ public class ListPopupImpl extends WizardPopup implements ListPopup { } + @Override public void addListSelectionListener(ListSelectionListener listSelectionListener) { myList.addListSelectionListener(listSelectionListener); } diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java b/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java index 82abf3ad6522..c8d0ac85aaa8 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java @@ -16,14 +16,13 @@ package com.intellij.xdebugger.breakpoints.ui; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.impl.DocumentMarkupModel; import com.intellij.openapi.editor.markup.MarkupModel; import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.popup.JBPopup; +import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.ColorUtil; import com.intellij.ui.ColoredListCellRenderer; @@ -43,17 +42,25 @@ import javax.swing.*; * To change this template use File | Settings | File Templates. */ public abstract class BreakpointItem implements ItemWrapper { + protected static final Key BREAKPOINT_ITEM = Key.create("BreakpointItem"); + public abstract Object getBreakpoint(); public abstract boolean isEnabled(); public abstract void setEnabled(boolean state); - protected void showInEditor(DetailView panel, VirtualFile virtualFile, int line) { + protected boolean showInEditor(DetailView panel, VirtualFile virtualFile, int line) { TextAttributes attributes = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(DebuggerColors.BREAKPOINT_ATTRIBUTES); - panel.navigateInPreviewEditor(virtualFile, new LogicalPosition(line, 0), attributes); + DetailView.PreviewEditorState state = DetailView.PreviewEditorState.create(virtualFile, line, attributes); + + if (state.equals(panel.getEditorState())) { + return false; + } + + panel.navigateInPreviewEditor(state); TextAttributes softerAttributes = attributes.clone(); softerAttributes.setBackgroundColor(ColorUtil.softer(softerAttributes.getBackgroundColor())); @@ -72,10 +79,7 @@ public abstract class BreakpointItem implements ItemWrapper { } } } - } - - @Override - public void execute(Project project, JBPopup popup) { + return true; } @Override @@ -86,14 +90,49 @@ public abstract class BreakpointItem implements ItemWrapper { @Override public void setupRenderer(ColoredListCellRenderer renderer, Project project, boolean selected) { - setupGenericRenderer(renderer); + setupGenericRenderer(renderer, true); } @Override public void setupRenderer(ColoredTreeCellRenderer renderer) { - setupGenericRenderer(renderer); + boolean plainView = renderer.getTree().getClientProperty("plainView") != null; + setupGenericRenderer(renderer, plainView); } - protected abstract void setupGenericRenderer(SimpleColoredComponent renderer); + @Override + public void updateDetailView(DetailView panel) { + if (panel.getUserData(BREAKPOINT_ITEM) == getBreakpoint()) { + return; + } + + doUpdateDetailView(panel); + + panel.putUserData(BREAKPOINT_ITEM, getBreakpoint()); + } + + protected abstract void setupGenericRenderer(SimpleColoredComponent renderer, boolean plainView); + + public abstract Icon getIcon(); + + public abstract String getDisplayText(); + + protected abstract void doUpdateDetailView(DetailView panel); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + BreakpointItem item = (BreakpointItem)o; + + if (getBreakpoint() != null ? !getBreakpoint().equals(item.getBreakpoint()) : item.getBreakpoint() != null) return false; + + return true; + } + + @Override + public int hashCode() { + return getBreakpoint() != null ? getBreakpoint().hashCode() : 0; + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java index 3df95722ff41..9e22e023753f 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java @@ -46,22 +46,28 @@ class XBreakpointItem extends BreakpointItem { @Override public void setupRenderer(ColoredListCellRenderer renderer, Project project, boolean selected) { - setupGenericRenderer(renderer); + setupGenericRenderer(renderer, false); } @Override public void setupRenderer(ColoredTreeCellRenderer renderer) { - setupGenericRenderer(renderer); + setupGenericRenderer(renderer, false); } - protected void setupGenericRenderer(SimpleColoredComponent renderer) { - //renderer.setIcon(getIcon()); + protected void setupGenericRenderer(SimpleColoredComponent renderer, boolean plainView) { + if (plainView) { + renderer.setIcon(getIcon()); + } final SimpleTextAttributes attributes = myBreakpoint.isEnabled() ? SimpleTextAttributes.SIMPLE_CELL_ATTRIBUTES : SimpleTextAttributes.GRAYED_ATTRIBUTES; - renderer.append(XBreakpointUtil.getShortText(myBreakpoint), attributes); + renderer.append(getDisplayText(), attributes); } - private Icon getIcon() { + public String getDisplayText() { + return XBreakpointUtil.getShortText(myBreakpoint); + } + + public Icon getIcon() { return ((XBreakpointBase)myBreakpoint).getIcon(); } @@ -75,21 +81,22 @@ class XBreakpointItem extends BreakpointItem { return ((XBreakpointBase)myBreakpoint).getType().getDisplayText(myBreakpoint); } - @Override - public void updateDetailView(DetailView panel) { + public void doUpdateDetailView(DetailView panel) { Project project = ((XBreakpointBase)myBreakpoint).getProject(); + XSourcePosition sourcePosition = myBreakpoint.getSourcePosition(); + if (sourcePosition != null) { + if (!showInEditor(panel, sourcePosition.getFile(), sourcePosition.getLine())) { + return; + } + } else { + panel.clearEditor(); + } + XLightBreakpointPropertiesPanel> propertiesPanel = new XLightBreakpointPropertiesPanel>(project, getManager(), myBreakpoint, true); propertiesPanel.loadProperties(); panel.setDetailPanel(propertiesPanel.getMainPanel()); - - XSourcePosition sourcePosition = myBreakpoint.getSourcePosition(); - if (sourcePosition != null) { - showInEditor(panel, sourcePosition.getFile(), sourcePosition.getLine()); - } else { - panel.clearEditor(); - } } private XBreakpointManagerImpl getManager() { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointsMasterDetailPopupFactory.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointsMasterDetailPopupFactory.java index 748c2789f3f2..8d4bb612ce6c 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointsMasterDetailPopupFactory.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointsMasterDetailPopupFactory.java @@ -22,6 +22,7 @@ import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupListener; import com.intellij.openapi.ui.popup.LightweightWindowEvent; import com.intellij.xdebugger.impl.DebuggerSupport; +import com.intellij.xdebugger.impl.breakpoints.ui.tree.BreakpointMasterDetailPopupBuilder; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -31,22 +32,26 @@ import java.util.List; public class BreakpointsMasterDetailPopupFactory { - private final List myBreakpointPanelProviders; private Project myProject; private Balloon myBalloonToHide; public BreakpointsMasterDetailPopupFactory(Project project) { myProject = project; - myBreakpointPanelProviders = new ArrayList(); + collectPanelProviders(); + } + + public static List collectPanelProviders() { + List panelProviders = new ArrayList(); for (DebuggerSupport debuggerSupport : DebuggerSupport.getDebuggerSupports()) { - myBreakpointPanelProviders.add(debuggerSupport.getBreakpointPanelProvider()); + panelProviders.add(debuggerSupport.getBreakpointPanelProvider()); } - Collections.sort(myBreakpointPanelProviders, new Comparator() { + Collections.sort(panelProviders, new Comparator() { @Override public int compare(BreakpointPanelProvider o1, BreakpointPanelProvider o2) { return o2.getPriority() - o1.getPriority(); } }); + return panelProviders; } public void setBalloonToHide(Balloon balloonToHide) { @@ -60,7 +65,7 @@ public class BreakpointsMasterDetailPopupFactory { public JBPopup createPopup(@Nullable Object initialBreakpoint) { BreakpointMasterDetailPopupBuilder builder = new BreakpointMasterDetailPopupBuilder(myProject); builder.setInitialBreakpoint(initialBreakpoint); - builder.setBreakpointsPanelProviders(myBreakpointPanelProviders); + builder.setBreakpointsPanelProviders(collectPanelProviders()); final JBPopup popup = builder.createPopup(); popup.addListener(new JBPopupListener() { @Override diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointItemNode.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointItemNode.java new file mode 100644 index 000000000000..4393ce9389d4 --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointItemNode.java @@ -0,0 +1,33 @@ +/* + * Copyright 2000-2012 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. + */ +package com.intellij.xdebugger.impl.breakpoints.ui.tree; + +import com.intellij.ui.CheckedTreeNode; +import com.intellij.xdebugger.breakpoints.ui.BreakpointItem; + +class BreakpointItemNode extends CheckedTreeNode { + private final BreakpointItem myBreakpoint; + + BreakpointItemNode(final BreakpointItem breakpoint) { + super(breakpoint); + myBreakpoint = breakpoint; + setChecked(breakpoint.isEnabled()); + } + + public BreakpointItem getBreakpointItem() { + return myBreakpoint; + } +} diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointItemsTree.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointItemsTreeController.java similarity index 74% rename from platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointItemsTree.java rename to platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointItemsTreeController.java index 13fe05927c62..b94ec8b72ed8 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointItemsTree.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointItemsTreeController.java @@ -13,13 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.xdebugger.impl.breakpoints.ui; +package com.intellij.xdebugger.impl.breakpoints.ui.tree; import com.intellij.ide.util.treeView.TreeState; import com.intellij.openapi.util.MultiValuesMap; -import com.intellij.ui.CheckboxTree; import com.intellij.ui.CheckedTreeNode; -import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.ui.tree.TreeUtil; import com.intellij.xdebugger.breakpoints.XBreakpoint; import com.intellij.xdebugger.breakpoints.XBreakpointManager; @@ -39,7 +37,7 @@ import java.util.*; /** * @author nik, zajac */ -public class BreakpointItemsTree extends CheckboxTree { +public class BreakpointItemsTreeController implements BreakpointsCheckboxTree.Delegate { //private final TreeNodeComparator myComparator; private final CheckedTreeNode myRoot; private final Map myNodes = new HashMap(); @@ -50,14 +48,20 @@ public class BreakpointItemsTree extends CheckboxTree { private final MultiValuesMap myGroups = new MultiValuesMap(); - private BreakpointItemsTree(final CheckedTreeNode root, - Collection groupingRules) { - super(new BreakpointsTreeCellRenderer(), root); - myRoot = root; + private JTree myTreeView; + + public BreakpointItemsTreeController(Collection groupingRules) { + myRoot = new CheckedTreeNode("root"); //myComparator = new TreeNodeComparator(type, breakpointManager); setGroupingRulesInternal(groupingRules); + } - getEmptyText().setText("No Breakpoints"); + public void setTreeView(JTree treeView) { + myTreeView = treeView; + if (treeView instanceof BreakpointsCheckboxTree) { + ((BreakpointsCheckboxTree)treeView).setDelegate(this); + } + myTreeView.setShowsRootHandles(!myGroupingRules.isEmpty()); } public void setDelegate(BreakpointItemsTreeDelegate delegate) { @@ -66,15 +70,10 @@ public class BreakpointItemsTree extends CheckboxTree { private void setGroupingRulesInternal(final Collection groupingRules) { myGroupingRules = new ArrayList(groupingRules); - setShowsRootHandles(!groupingRules.isEmpty()); - } - - public static BreakpointItemsTree createTree(final Collection groupingRules) { - return new BreakpointItemsTree(new CheckedTreeNode("root"), groupingRules); } public void buildTree(@NotNull Collection breakpoints) { - final TreeState state = TreeState.createOn(this, myRoot); + final TreeState state = TreeState.createOn(myTreeView, myRoot); myRoot.removeAllChildren(); myNodes.clear(); myGroupNodes.clear(); @@ -86,9 +85,9 @@ public class BreakpointItemsTree extends CheckboxTree { myNodes.put(breakpoint, node); } //TreeUtil.sort(myRoot, myComparator); - ((DefaultTreeModel)getModel()).nodeStructureChanged(myRoot); - state.applyTo(this, myRoot); - TreeUtil.expandAll(this); + ((DefaultTreeModel)(myTreeView.getModel())).nodeStructureChanged(myRoot); + state.applyTo(myTreeView, myRoot); + TreeUtil.expandAll(myTreeView); } @@ -146,24 +145,28 @@ public class BreakpointItemsTree extends CheckboxTree { } @Override - protected void onDoubleClick(CheckedTreeNode node) { + public void didSelectNode(CheckedTreeNode node) { if (node instanceof BreakpointItemNode) { myDelegate.execute(((BreakpointItemNode)node).getBreakpointItem()); } } @Override - protected void onNodeStateChanged(final CheckedTreeNode node) { + public void nodeStateChanged(CheckedTreeNode node) { if (node instanceof BreakpointItemNode) { ((BreakpointItemNode)node).getBreakpointItem().setEnabled(node.isChecked()); } } public void setGroupingRules(Collection groupingRules) { - List selectedBreakpoints = getSelectedBreakpoints(); - List allBreakpoints = new ArrayList(myNodes.keySet()); - setGroupingRulesInternal(groupingRules); + rebuildTree(new ArrayList(myNodes.keySet())); + } + + public void rebuildTree(Collection items) { + List selectedBreakpoints = getSelectedBreakpoints(); + Collection allBreakpoints = items; + buildTree(allBreakpoints); if (selectedBreakpoints.size() > 0) { @@ -173,7 +176,7 @@ public class BreakpointItemsTree extends CheckboxTree { public List getSelectedBreakpoints() { final ArrayList list = new ArrayList(); - TreePath[] selectionPaths = getSelectionPaths(); + TreePath[] selectionPaths = myTreeView.getSelectionPaths(); if (selectionPaths == null || selectionPaths.length == 0) return list; for (TreePath selectionPath : selectionPaths) { @@ -193,58 +196,12 @@ public class BreakpointItemsTree extends CheckboxTree { public void selectBreakpointItem(final BreakpointItem breakpoint) { BreakpointItemNode node = myNodes.get(breakpoint); if (node != null) { - TreeUtil.selectNode(this, node); + TreeUtil.selectNode(myTreeView, node); } } - private static class BreakpointsTreeCellRenderer extends CheckboxTreeCellRenderer { - @Override - public void customizeRenderer(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { - if (value instanceof BreakpointItemNode) { - BreakpointItemNode node = (BreakpointItemNode)value; - BreakpointItem breakpoint = node.getBreakpointItem(); - breakpoint.setupRenderer(getTextRenderer()); - } - else if (value instanceof BreakpointsGroupNode) { - XBreakpointGroup group = ((BreakpointsGroupNode)value).getGroup(); - getTextRenderer().setIcon(group.getIcon(expanded)); - getTextRenderer().append(group.getName(), SimpleTextAttributes.SIMPLE_CELL_ATTRIBUTES); - } - } - } - - private static class BreakpointsGroupNode extends CheckedTreeNode { - private final G myGroup; - private final int myLevel; - - private BreakpointsGroupNode(G group, int level) { - super(group); - myLevel = level; - setChecked(false); - myGroup = group; - } - - public G getGroup() { - return myGroup; - } - - public int getLevel() { - return myLevel; - } - } - - private static class BreakpointItemNode extends CheckedTreeNode { - private final BreakpointItem myBreakpoint; - - private BreakpointItemNode(final BreakpointItem breakpoint) { - super(breakpoint); - myBreakpoint = breakpoint; - setChecked(breakpoint.isEnabled()); - } - - public BreakpointItem getBreakpointItem() { - return myBreakpoint; - } + public CheckedTreeNode getRoot() { + return myRoot; } private static class TreeNodeComparator> implements Comparator { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointMasterDetailPopupBuilder.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointMasterDetailPopupBuilder.java similarity index 58% rename from platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointMasterDetailPopupBuilder.java rename to platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointMasterDetailPopupBuilder.java index fce09fb83953..1514342a3546 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointMasterDetailPopupBuilder.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointMasterDetailPopupBuilder.java @@ -13,53 +13,94 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.xdebugger.impl.breakpoints.ui; +package com.intellij.xdebugger.impl.breakpoints.ui.tree; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.ex.CheckboxAction; -import com.intellij.openapi.editor.colors.EditorColorsManager; -import com.intellij.openapi.editor.colors.EditorColorsScheme; -import com.intellij.openapi.editor.colors.ex.DefaultColorSchemesManager; -import com.intellij.openapi.editor.colors.impl.EditorColorsSchemeImpl; -import com.intellij.openapi.editor.markup.EffectType; -import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.JBPopupListener; import com.intellij.openapi.ui.popup.LightweightWindowEvent; import com.intellij.ui.IdeBorderFactory; +import com.intellij.ui.popup.util.DetailView; +import com.intellij.ui.popup.util.ItemWrapper; import com.intellij.ui.popup.util.MasterDetailPopupBuilder; import com.intellij.util.IconUtil; import com.intellij.util.PlatformIcons; import com.intellij.util.containers.HashSet; import com.intellij.xdebugger.breakpoints.ui.BreakpointItem; import com.intellij.xdebugger.breakpoints.ui.XBreakpointGroupingRule; -import com.intellij.xdebugger.ui.DebuggerColors; +import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.awt.*; import java.awt.event.KeyEvent; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; +import java.util.*; public class BreakpointMasterDetailPopupBuilder { private Project myProject; private MasterDetailPopupBuilder myPopupBuilder; - private Collection myBreakpointsPanelProviders; - private BreakpointItemsTree myTree; + private Collection myBreakpointsPanelProviders = Collections.emptyList(); + private BreakpointItemsTreeController myTreeController; private final List myRulesAvailable = new ArrayList(); private final Set myRulesEnabled = new HashSet(); @Nullable private Object myInitialBreakpoint; + @Nullable private BreakpointChosenCallback myCallback = null; + + private boolean myAddDetailViewToEast = true; + + private DetailView myDetailView; + + private boolean myIsViewer; + + private boolean myPlainView = false; + + public boolean isPlainView() { + return myPlainView; + } + + public void setPlainView(boolean plainView) { + myPlainView = plainView; + } + + public Collection getBreakpointItems() { + return myBreakpointItems; + } + + public void setBreakpointItems(Collection breakpointItems) { + myBreakpointItems = breakpointItems; + } + + private Collection myBreakpointItems = new ArrayList(); + + public void setDetailView(DetailView detailView) { + myDetailView = detailView; + } + + public void setAddDetailViewToEast(boolean addDetailViewToEast) { + myAddDetailViewToEast = addDetailViewToEast; + } + + public void setCallback(BreakpointChosenCallback callback) { + myCallback = callback; + } + + public void setIsViewer(boolean isViewer) { + myIsViewer = isViewer; + } + + public interface BreakpointChosenCallback { + void breakpointChosen(Project project, BreakpointItem breakpointItem, JBPopup popup); + } + public void setInitialBreakpoint(@Nullable Object initialBreakpoint) { myInitialBreakpoint = initialBreakpoint; } @@ -67,34 +108,50 @@ public class BreakpointMasterDetailPopupBuilder { public BreakpointMasterDetailPopupBuilder(Project project) { myProject = project; } - public JBPopup createPopup() { myPopupBuilder = new MasterDetailPopupBuilder(myProject); + if (myDetailView != null) { + myPopupBuilder.setDetailView(myDetailView); + } + myPopupBuilder.setAddDetailViewToEast(myAddDetailViewToEast); + for (BreakpointPanelProvider provider : myBreakpointsPanelProviders) { provider.createBreakpointsGroupingRules(myRulesAvailable); } - for (XBreakpointGroupingRule rule : myRulesAvailable) { - if (rule.isAlwaysEnabled()) { - myRulesEnabled.add(rule); + if (!myIsViewer) { + for (XBreakpointGroupingRule rule : myRulesAvailable) { + if (rule.isAlwaysEnabled()) { + myRulesEnabled.add(rule); + } } } DefaultActionGroup actions = createActions(); - myTree = BreakpointItemsTree.createTree(getEnabledRulesList()); + myTreeController = new BreakpointItemsTreeController(getEnabledRulesList()); - final ArrayList breakpoints = collectItems(); - myTree.buildTree(breakpoints); + JTree tree = myIsViewer ? new BreakpointsSimpleTree(myTreeController) : new BreakpointsCheckboxTree(myTreeController); + + if (myPlainView) { + tree.putClientProperty("plainView", Boolean.TRUE); + } + + myTreeController.setTreeView(tree); + + collectItems(); + + myTreeController.buildTree(myBreakpointItems); final BreakpointPanelProvider.BreakpointsListener listener = new BreakpointPanelProvider.BreakpointsListener() { @Override public void breakpointsChanged() { - myTree.buildTree(collectItems()); + collectItems(); + myTreeController.rebuildTree(myBreakpointItems); } }; @@ -102,41 +159,55 @@ public class BreakpointMasterDetailPopupBuilder { provider.addListener(listener, myProject); } + final MasterDetailPopupBuilder.Delegate delegate = new MasterDetailPopupBuilder.Delegate() { + @Nullable + @Override + public String getTitle() { + return myIsViewer ? null : "Breakpoints"; + } + + @Override + public void handleMnemonic(KeyEvent e, Project project, JBPopup popup) { + //To change body of implemented methods use File | Settings | File Templates. + } + + public JComponent createAccessoryView(Project project) { + return new JCheckBox(); + } + + @Override + public Object[] getSelectedItemsInTree() { + final List res = myTreeController.getSelectedBreakpoints(); + return res.toArray(new Object[res.size()]); + } + + @Override + public void itemChosen(ItemWrapper item, Project project, JBPopup popup) { + if (!(item instanceof BreakpointItem)) { + return; + } + if (myCallback != null){ + myCallback.breakpointChosen(project, (BreakpointItem)item, popup); + } + } + }; + final JBPopup popup = myPopupBuilder. setActionsGroup(actions). - setTree(myTree). - setDelegate(new MasterDetailPopupBuilder.Delegate() { - @Override - public String getTitle() { - return "Breakpoints"; - } + setTree(tree). + setDelegate(delegate). + setCloseOnEnter(false).createMasterDetailPopup(); - @Override - public void handleMnemonic(KeyEvent e, Project project, JBPopup popup) { - //To change body of implemented methods use File | Settings | File Templates. - } + tree.setBorder(IdeBorderFactory.createBorder()); - public JComponent createAccessoryView(Project project) { - return new JCheckBox(); - } - - @Override - public Object[] getSelectedItemsInTree() { - final List res = myTree.getSelectedBreakpoints(); - return res.toArray(new Object[res.size()]); - } - }).setCloseOnEnter(false).createMasterDetailPopup(); - - myTree.setBorder(IdeBorderFactory.createBorder()); - - myTree.setDelegate(new BreakpointItemsTree.BreakpointItemsTreeDelegate() { + myTreeController.setDelegate(new BreakpointItemsTreeController.BreakpointItemsTreeDelegate() { @Override public void execute(BreakpointItem item) { - item.execute(myProject, popup); + delegate.itemChosen(item, myProject, popup); } }); - initSelection(breakpoints); + initSelection(myBreakpointItems); popup.addListener(new JBPopupListener() { @Override @@ -155,31 +226,26 @@ public class BreakpointMasterDetailPopupBuilder { return popup; } - void initSelection(ArrayList breakpoints) { + void initSelection(Collection breakpoints) { boolean found = false; for (BreakpointItem breakpoint : breakpoints) { if (breakpoint.getBreakpoint() == myInitialBreakpoint) { - myTree.selectBreakpointItem(breakpoint); + myTreeController.selectBreakpointItem(breakpoint); found = true; break; } } if (!found && !breakpoints.isEmpty()) { - myTree.selectBreakpointItem(breakpoints.get(0)); + myTreeController.selectBreakpointItem(breakpoints.iterator().next()); } } - EditorColorsScheme createScheme() { - final EditorColorsScheme scheme = - new EditorColorsSchemeImpl(EditorColorsManager.getInstance().getGlobalScheme(), DefaultColorSchemesManager.getInstance()); - scheme.setName("abc"); - scheme - .setAttributes(DebuggerColors.BREAKPOINT_ATTRIBUTES, new TextAttributes(Color.black, Color.CYAN, null, EffectType.BOXED, Font.BOLD)); - return scheme; - } - + @Nullable DefaultActionGroup createActions() { + if (myIsViewer) { + return null; + } DefaultActionGroup actions = new DefaultActionGroup(); final DefaultActionGroup breakpointTypes = new DefaultActionGroup(); for (BreakpointPanelProvider provider : myBreakpointsPanelProviders) { @@ -215,15 +281,16 @@ public class BreakpointMasterDetailPopupBuilder { return actions; } - ArrayList collectItems() { - ArrayList items = new ArrayList(); - for (BreakpointPanelProvider panelProvider : myBreakpointsPanelProviders) { - panelProvider.provideBreakpointItems(myProject, items); + void collectItems() { + if (!myBreakpointsPanelProviders.isEmpty()) { + myBreakpointItems.clear(); + for (BreakpointPanelProvider panelProvider : myBreakpointsPanelProviders) { + panelProvider.provideBreakpointItems(myProject, myBreakpointItems); + } } - return items; } - public void setBreakpointsPanelProviders(Collection breakpointsPanelProviders) { + public void setBreakpointsPanelProviders(@NotNull Collection breakpointsPanelProviders) { myBreakpointsPanelProviders = breakpointsPanelProviders; } @@ -249,7 +316,7 @@ public class BreakpointMasterDetailPopupBuilder { else { myRulesEnabled.remove(myRule); } - myTree.setGroupingRules(getEnabledRulesList()); + myTreeController.setGroupingRules(getEnabledRulesList()); } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsCheckboxTree.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsCheckboxTree.java new file mode 100644 index 000000000000..2194b662d719 --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsCheckboxTree.java @@ -0,0 +1,55 @@ +/* + * Copyright 2000-2012 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. + */ +package com.intellij.xdebugger.impl.breakpoints.ui.tree; + +import com.intellij.ui.CheckboxTree; +import com.intellij.ui.CheckedTreeNode; + +public class BreakpointsCheckboxTree extends CheckboxTree { + + + @Override + protected void onDoubleClick(CheckedTreeNode node) { + super.onDoubleClick(node); + if (myDelegate != null) { + myDelegate.didSelectNode(node); + } + } + + @Override + protected void onNodeStateChanged(CheckedTreeNode node) { + super.onNodeStateChanged(node); + if (myDelegate != null) { + myDelegate.nodeStateChanged(node); + } + } + + interface Delegate { + void didSelectNode(CheckedTreeNode node); + + void nodeStateChanged(CheckedTreeNode node); + } + + public void setDelegate(Delegate delegate) { + myDelegate = delegate; + } + + private Delegate myDelegate = null; + + public BreakpointsCheckboxTree(BreakpointItemsTreeController model) { + super(new BreakpointsTreeCellRenderer.BreakpointsCheckboxTreeCellRenderer(), model.getRoot()); + } +} diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsGroupNode.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsGroupNode.java new file mode 100644 index 000000000000..d6868352d8a8 --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsGroupNode.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2012 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. + */ +package com.intellij.xdebugger.impl.breakpoints.ui.tree; + +import com.intellij.ui.CheckedTreeNode; +import com.intellij.xdebugger.breakpoints.ui.XBreakpointGroup; + +class BreakpointsGroupNode extends CheckedTreeNode { + private final G myGroup; + private final int myLevel; + + BreakpointsGroupNode(G group, int level) { + super(group); + myLevel = level; + setChecked(false); + myGroup = group; + } + + public G getGroup() { + return myGroup; + } + + public int getLevel() { + return myLevel; + } +} diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsSimpleTree.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsSimpleTree.java new file mode 100644 index 000000000000..b7e1c70d900c --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsSimpleTree.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2012 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. + */ +package com.intellij.xdebugger.impl.breakpoints.ui.tree; + +import com.intellij.ui.treeStructure.Tree; + +public class BreakpointsSimpleTree extends Tree { + public BreakpointsSimpleTree(BreakpointItemsTreeController controller) { + super(controller.getRoot()); + setCellRenderer(new BreakpointsTreeCellRenderer.BreakpointsSimpleTreeCellRenderer()); + setRootVisible(false); + } +} diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsTreeCellRenderer.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsTreeCellRenderer.java new file mode 100644 index 000000000000..0878e291903d --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointsTreeCellRenderer.java @@ -0,0 +1,67 @@ +/* + * Copyright 2000-2012 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. + */ +package com.intellij.xdebugger.impl.breakpoints.ui.tree; + +import com.intellij.ui.CheckboxTree; +import com.intellij.ui.ColoredTreeCellRenderer; +import com.intellij.ui.SimpleTextAttributes; +import com.intellij.xdebugger.breakpoints.ui.BreakpointItem; +import com.intellij.xdebugger.breakpoints.ui.XBreakpointGroup; + +import javax.swing.*; + +class BreakpointsTreeCellRenderer { + private static void customizeRenderer(JTree tree, + Object value, + boolean selected, + boolean expanded, + boolean leaf, + int row, + boolean hasFocus, + ColoredTreeCellRenderer renderer) { + if (value instanceof BreakpointItemNode) { + BreakpointItemNode node = (BreakpointItemNode)value; + BreakpointItem breakpoint = node.getBreakpointItem(); + breakpoint.setupRenderer(renderer); + } + else if (value instanceof BreakpointsGroupNode) { + XBreakpointGroup group = ((BreakpointsGroupNode)value).getGroup(); + renderer.setIcon(group.getIcon(expanded)); + renderer.append(group.getName(), SimpleTextAttributes.SIMPLE_CELL_ATTRIBUTES); + } + } + + public static class BreakpointsCheckboxTreeCellRenderer extends CheckboxTree.CheckboxTreeCellRenderer { + @Override + public void customizeRenderer(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + BreakpointsTreeCellRenderer.customizeRenderer(tree, value, selected, expanded, leaf, row, hasFocus, getTextRenderer()); + } + } + + public static class BreakpointsSimpleTreeCellRenderer extends ColoredTreeCellRenderer { + + @Override + public void customizeCellRenderer(JTree tree, + Object value, + boolean selected, + boolean expanded, + boolean leaf, + int row, + boolean hasFocus) { + BreakpointsTreeCellRenderer.customizeRenderer(tree, value, selected, expanded, leaf, row, hasFocus, this); + } + } +} diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java index 8b7135769d4c..300981ef56ea 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java @@ -21,7 +21,7 @@ import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ComboBoxAction; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.popup.ListPopup; +import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; @@ -65,7 +65,7 @@ public class SwitchTaskCombo extends ComboBoxAction implements DumbAware { } @Override - protected ListPopup createPopup(Runnable onDispose) { + protected JBPopup createPopup(Runnable onDispose) { return SwitchTaskAction.createPopup(DataManager.getInstance().getDataContext(this), onDispose, false); } }; diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/AbstractComboBoxAction.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/AbstractComboBoxAction.java index 90cc87f7926f..6528a310515a 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/AbstractComboBoxAction.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/AbstractComboBoxAction.java @@ -20,6 +20,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.actionSystem.ex.ComboBoxAction; +import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.util.PlatformIcons; @@ -85,7 +86,7 @@ public abstract class AbstractComboBoxAction extends ComboBoxAction { if (myShowDisabledActions) { return new ComboBoxButton(presentation) { @Override - protected ListPopup createPopup(Runnable onDispose) { + protected JBPopup createPopup(Runnable onDispose) { ListPopup popup = JBPopupFactory.getInstance().createActionGroupPopup( null, createPopupActionGroup(this), getDataContext(), JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, true, onDispose, getMaxRows()); From c6953ea96b9eef47fd0d94ceb1248ccb7aa4de3b Mon Sep 17 00:00:00 2001 From: "andrey.zaytsev" Date: Fri, 8 Jun 2012 15:53:05 +0400 Subject: [PATCH 9/9] breakpoints ui. detail view for bookmarks fixed --- .../com/intellij/ui/popup/util/MasterDetailPopupBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java b/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java index de8a4ae7408b..37d4add0c33d 100644 --- a/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java +++ b/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java @@ -60,7 +60,7 @@ public class MasterDetailPopupBuilder { private Alarm myUpdateAlarm; private JComponent myChooserComponent; private ActionToolbar myActionToolbar; - private boolean myAddDetailViewToEast; + private boolean myAddDetailViewToEast = true; public MasterDetailPopupBuilder setDetailView(DetailView detailView) {