summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Perez <diegoperez@google.com>2015-04-24 15:17:55 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-04-24 15:17:55 +0000
commit685f616b501b46622f1346f7f29053b55dbc5256 (patch)
treeb7c90184f3c7dd90022f327a6fb9f989bf637770
parent14d34fb40aa3d03fb6ca63f8e0ec86ba57f6468c (diff)
parentab9911a124e208d4b7425072d0d41accecbba97a (diff)
downloadidea-685f616b501b46622f1346f7f29053b55dbc5256.tar.gz
am ab9911a1: am c707abfd: am 7e2b7e7c: Merge "Refresh preview after a build is completed" into studio-1.3-dev automerge: f9a8e18 automerge: c0f06aa
* commit 'ab9911a124e208d4b7425072d0d41accecbba97a': Refresh preview after a build is completed
-rw-r--r--android/src/com/android/tools/idea/editors/theme/AndroidThemePreviewPanel.java98
-rw-r--r--android/src/com/android/tools/idea/editors/theme/ThemeEditorComponent.java29
2 files changed, 77 insertions, 50 deletions
diff --git a/android/src/com/android/tools/idea/editors/theme/AndroidThemePreviewPanel.java b/android/src/com/android/tools/idea/editors/theme/AndroidThemePreviewPanel.java
index 1bd913a767c..cb47af645f0 100644
--- a/android/src/com/android/tools/idea/editors/theme/AndroidThemePreviewPanel.java
+++ b/android/src/com/android/tools/idea/editors/theme/AndroidThemePreviewPanel.java
@@ -174,7 +174,6 @@ public class AndroidThemePreviewPanel extends Box implements RenderContext {
myDumbService = DumbService.getInstance(myConfiguration.getModule().getProject());
myMinApiLevel = configuration.getTarget() != null ? configuration.getTarget().getVersion().getApiLevel() : Integer.MAX_VALUE;
- rebuild(false/*forceRepaint*/);
JBScrollPane scrollPanel = new JBScrollPane(myAndroidPreviewPanel,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
@@ -221,11 +220,61 @@ public class AndroidThemePreviewPanel extends Box implements RenderContext {
add(mySearchTextField);
add(scrollPanel);
- // Find custom controls
+ reloadComponents();
+
+ myBreadcrumbs.addItemListener(new NavigationComponent.ItemListener<Breadcrumb>() {
+ @Override
+ public void itemSelected(@NotNull Breadcrumb item) {
+ myBreadcrumbs.goTo(item);
+ rebuild();
+ }
+ });
+
+ myAndroidPreviewPanel.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ ViewInfo view = myAndroidPreviewPanel.findViewAtPoint(e.getPoint());
+
+ if (view == null) {
+ return;
+ }
+
+ mySearchTextField.setText("");
+
+ Object cookie = view.getCookie();
+ if (cookie instanceof MergeCookie) {
+ cookie = ((MergeCookie)cookie).getCookie();
+ }
+
+ if (!(cookie instanceof Element)) {
+ return;
+ }
+
+ NamedNodeMap attributes = ((Element)cookie).getAttributes();
+ Node group = attributes.getNamedItemNS(ThemePreviewBuilder.BUILDER_URI, ThemePreviewBuilder.BUILDER_ATTR_GROUP);
+
+ if (group != null) {
+ myBreadcrumbs.push(new Breadcrumb(ThemePreviewBuilder.ComponentGroup.valueOf(group.getNodeValue())));
+ rebuild();
+ }
+ }
+ });
+ }
+
+ @NotNull
+ public Set<String> getUsedAttrs() {
+ return myAndroidPreviewPanel.getUsedAttrs();
+ }
+
+ /**
+ * Searches the PSI for both custom components and support library classes. Call this method when you
+ * want to refresh the components displayed on the preview.
+ */
+ public void reloadComponents() {
myDumbService.runWhenSmart(new Runnable() {
@Override
public void run() {
- Project project = configuration.getModule().getProject();
+ Project project = myConfiguration.getModule().getProject();
if (!project.isOpen()) {
return;
}
@@ -279,48 +328,7 @@ public class AndroidThemePreviewPanel extends Box implements RenderContext {
}
});
- myBreadcrumbs.addItemListener(new NavigationComponent.ItemListener<Breadcrumb>() {
- @Override
- public void itemSelected(@NotNull Breadcrumb item) {
- myBreadcrumbs.goTo(item);
- rebuild();
- }
- });
-
- myAndroidPreviewPanel.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- ViewInfo view = myAndroidPreviewPanel.findViewAtPoint(e.getPoint());
-
- if (view == null) {
- return;
- }
-
- mySearchTextField.setText("");
-
- Object cookie = view.getCookie();
- if (cookie instanceof MergeCookie) {
- cookie = ((MergeCookie)cookie).getCookie();
- }
-
- if (!(cookie instanceof Element)) {
- return;
- }
-
- NamedNodeMap attributes = ((Element)cookie).getAttributes();
- Node group = attributes.getNamedItemNS(ThemePreviewBuilder.BUILDER_URI, ThemePreviewBuilder.BUILDER_ATTR_GROUP);
-
- if (group != null) {
- myBreadcrumbs.push(new Breadcrumb(ThemePreviewBuilder.ComponentGroup.valueOf(group.getNodeValue())));
- rebuild();
- }
- }
- });
- }
-
- @NotNull
- public Set<String> getUsedAttrs() {
- return myAndroidPreviewPanel.getUsedAttrs();
+ rebuild(false);
}
/**
diff --git a/android/src/com/android/tools/idea/editors/theme/ThemeEditorComponent.java b/android/src/com/android/tools/idea/editors/theme/ThemeEditorComponent.java
index a1441d9aa8b..805a946c495 100644
--- a/android/src/com/android/tools/idea/editors/theme/ThemeEditorComponent.java
+++ b/android/src/com/android/tools/idea/editors/theme/ThemeEditorComponent.java
@@ -23,12 +23,11 @@ import com.android.tools.idea.configurations.Configuration;
import com.android.tools.idea.configurations.ConfigurationListener;
import com.android.tools.idea.configurations.DeviceMenuAction;
import com.android.tools.idea.configurations.ThemeSelectionDialog;
-import com.android.tools.idea.editors.theme.attributes.AttributesGrouper;
-import com.android.tools.idea.editors.theme.attributes.AttributesModelColorPaletteModel;
-import com.android.tools.idea.editors.theme.attributes.AttributesTableModel;
-import com.android.tools.idea.editors.theme.attributes.ShowJavadocAction;
-import com.android.tools.idea.editors.theme.attributes.TableLabel;
+import com.android.tools.idea.editors.theme.attributes.*;
import com.android.tools.idea.editors.theme.attributes.editors.*;
+import com.android.tools.idea.gradle.compiler.PostProjectBuildTasksExecutor;
+import com.android.tools.idea.gradle.project.GradleBuildListener;
+import com.android.tools.idea.gradle.util.BuildMode;
import com.android.tools.idea.rendering.RenderLogger;
import com.android.tools.idea.rendering.RenderService;
import com.android.tools.idea.rendering.RenderTask;
@@ -45,6 +44,8 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Splitter;
import com.intellij.util.Processor;
+import com.intellij.util.messages.MessageBus;
+import com.intellij.util.messages.MessageBusConnection;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.android.dom.drawable.DrawableDomElement;
import org.jetbrains.android.dom.resources.Flag;
@@ -115,6 +116,7 @@ public class ThemeEditorComponent extends Splitter {
}
};
private ThemeEditorStyle mySelectedTheme;
+ private MessageBusConnection myMessageBusConnection;
public ThemeEditorComponent(final Configuration configuration, final Module module) {
this.myConfiguration = configuration;
@@ -288,6 +290,21 @@ public class ThemeEditorComponent extends Splitter {
setFirstComponent(myPreviewPanel);
setSecondComponent(myPanel.getRightPanel());
setShowDividerControls(false);
+
+ myMessageBusConnection = project.getMessageBus().connect(project);
+ myMessageBusConnection.subscribe(PostProjectBuildTasksExecutor.GRADLE_BUILD_TOPIC, new GradleBuildListener() {
+ @Override
+ public void buildFinished(@NotNull Project project, @Nullable BuildMode mode) {
+ if (project != myModule.getProject()) {
+ return;
+ }
+
+ // Classes probably have changed so reload the custom components and support library classes.
+ myPreviewPanel.reloadComponents();
+ myPreviewPanel.revalidate();
+ myPreviewPanel.repaint();
+ }
+ });
}
/**
@@ -655,6 +672,8 @@ public class ThemeEditorComponent extends Splitter {
@Override
public void dispose() {
myConfiguration.removeListener(myConfigListener);
+ myMessageBusConnection.disconnect();
+ myMessageBusConnection = null;
super.dispose();
}