aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2011-05-20 20:41:35 -0700
committerTor Norbye <tnorbye@google.com>2011-05-23 12:52:37 -0700
commit8c224181ef61400338120015d1228513104a19e3 (patch)
treee8e38aeae9e74c92705f13ad05e5883322a60de6
parent1f03a6d703421d94c392c5afc74f7036d4c71167 (diff)
downloadsdk-8c224181ef61400338120015d1228513104a19e3.zip
sdk-8c224181ef61400338120015d1228513104a19e3.tar.gz
sdk-8c224181ef61400338120015d1228513104a19e3.tar.bz2
Detect and add special warning for wrong themes
If you open a layout designed for a particular theme in another theme, you can get many confusing error messages. Instead of "attribute missing" it may tell you that it failed to convert a resource to a color or drawable, and so on. To help guide users to the root problem (wrong theme chosen) this changeset detects the scenario where theme attributes can't be resolved, and when these are found the top of the error log will start with a bold message stating that theme resources were not found and to check whether the correct theme is chosen. To do this, the resource resolver emits a new sub-type of the resource missing tag into the error log, which is used in the IDE to prefix the errors with the special error message. Change-Id: Ic29c9af37da4b5cc2c9fb1ca5670c8b8f79bf852
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java12
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java5
-rw-r--r--ide_common/src/com/android/ide/common/resources/ResourceResolver.java19
-rw-r--r--layoutlib_api/src/com/android/ide/common/rendering/api/LayoutLog.java7
4 files changed, 34 insertions, 9 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
index 29811dc..18cb516 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
@@ -1755,7 +1755,9 @@ public class GraphicalEditorPart extends EditorPart
}
if (!append) {
- mErrorLabel.setText("");
+ mErrorLabel.setText(""); //$NON-NLS-1$
+ } else {
+ addText(mErrorLabel, "\n"); //$NON-NLS-1$
}
if (missingClasses.size() > 0) {
addText(mErrorLabel, "The following classes could not be found:\n");
@@ -1833,6 +1835,14 @@ public class GraphicalEditorPart extends EditorPart
AdtPlugin.log(e, null);
}
+ if (logger.seenTagPrefix(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR)) {
+ addBoldText(mErrorLabel,
+ "Missing styles. Is the correct theme chosen for this layout?\n");
+ addText(mErrorLabel,
+ "Use the Theme combo box above the layout to choose a different layout, " +
+ "or fix the theme style references.\n\n");
+ }
+
if (hasAaptErrors && logger.seenTagPrefix(LayoutLog.TAG_RESOURCES_PREFIX)) {
// Text will automatically be wrapped by the error widget so no reason
// to insert linebreaks in this error message:
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java
index e44c81b..5ec50c9 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java
@@ -72,7 +72,7 @@ class RenderLogger extends LayoutLog {
}
if (mFidelityWarnings != null) {
- sb.append("The graphics preview may not be accurate:\n");
+ sb.append("The graphics preview in the layout editor may not be accurate:\n");
for (String warning : mFidelityWarnings) {
sb.append("* ");
sb.append(warning).append('\n');
@@ -91,6 +91,7 @@ class RenderLogger extends LayoutLog {
@Override
public void error(String tag, String message, Object data) {
String description = describe(message);
+
AdtPlugin.log(IStatus.ERROR, "%1$s: %2$s", mName, description);
addError(tag, description);
@@ -211,6 +212,4 @@ class RenderLogger extends LayoutLog {
return false;
}
}
-
-
}
diff --git a/ide_common/src/com/android/ide/common/resources/ResourceResolver.java b/ide_common/src/com/android/ide/common/resources/ResourceResolver.java
index 89a4cba..938a6ef 100644
--- a/ide_common/src/com/android/ide/common/resources/ResourceResolver.java
+++ b/ide_common/src/com/android/ide/common/resources/ResourceResolver.java
@@ -67,14 +67,13 @@ public class ResourceResolver extends RenderResources {
}
/**
- * Creates a new ResourceResolver object.
+ * Creates a new {@link ResourceResolver} object.
*
- * @param IFrameworkResourceIdProvider an optional framework resource ID provider
* @param projectResources the project resources.
* @param frameworkResources the framework resources.
* @param themeName the name of the current theme.
* @param isProjectTheme Is this a project theme?
- * @return
+ * @return a new {@link ResourceResolver}
*/
public static ResourceResolver create(
Map<ResourceType, Map<String, ResourceValue>> projectResources,
@@ -231,12 +230,22 @@ public class ResourceResolver extends RenderResources {
}
// Now look for the item in the theme, starting with the current one.
+ ResourceValue item;
if (frameworkOnly) {
// FIXME for now we do the same as if it didn't specify android:
- return findItemInStyle(mTheme, referenceName);
+ item = findItemInStyle(mTheme, referenceName);
+ } else {
+ item = findItemInStyle(mTheme, referenceName);
+ }
+
+ if (item == null && mLogger != null) {
+ mLogger.warning(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR,
+ String.format("Couldn't find theme resource %1$s for the current theme",
+ reference),
+ new ResourceValue(ResourceType.ATTR, referenceName, frameworkOnly));
}
- return findItemInStyle(mTheme, referenceName);
+ return item;
} else if (reference.startsWith(PREFIX_RESOURCE_REF)) {
boolean frameworkOnly = false;
diff --git a/layoutlib_api/src/com/android/ide/common/rendering/api/LayoutLog.java b/layoutlib_api/src/com/android/ide/common/rendering/api/LayoutLog.java
index 26d0479..df29537 100644
--- a/layoutlib_api/src/com/android/ide/common/rendering/api/LayoutLog.java
+++ b/layoutlib_api/src/com/android/ide/common/rendering/api/LayoutLog.java
@@ -57,6 +57,13 @@ public class LayoutLog {
public final static String TAG_RESOURCES_RESOLVE = TAG_RESOURCES_PREFIX + "resolve";
/**
+ * Tag for resource resolution failure, specifically for theme attributes.
+ * In this case the warning/error data object will be a ResourceValue containing the type
+ * and name of the resource that failed to resolve
+ */
+ public final static String TAG_RESOURCES_RESOLVE_THEME_ATTR = TAG_RESOURCES_RESOLVE + ".theme";
+
+ /**
* Tag for failure when reading the content of a resource file.
*/
public final static String TAG_RESOURCES_READ = TAG_RESOURCES_PREFIX + "read";