diff --git a/plugins/android/resources/icons/refreshPreview.png b/plugins/android/resources/icons/refreshPreview.png new file mode 100644 index 000000000000..3a0e8a2042c8 Binary files /dev/null and b/plugins/android/resources/icons/refreshPreview.png differ diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java index 5a8c09f1a037..f9239975f4e4 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java @@ -65,7 +65,9 @@ public class AndroidPrecompileTask implements CompileTask { } } - CompilerManager.getInstance(project).addCompilationStatusListener(new MyCompilationStatusListener(project, addedEntries), project); + if (addedEntries.size() > 0) { + CompilerManager.getInstance(project).addCompilationStatusListener(new MyCompilationStatusListener(project, addedEntries), project); + } return true; } diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java index 3a0b8d0577d8..5a84b3d88a1b 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java @@ -483,7 +483,9 @@ public class AndroidFacet extends Facet { propertiesFile.addProperty(AndroidUtils.ANDROID_TARGET_PROPERTY, targetPropertyValue); } else { - property.setValue(targetPropertyValue); + if (!Comparing.equal(property.getValue(), targetPropertyValue)) { + property.setValue(targetPropertyValue); + } } } }); diff --git a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java index a7fcf23e10e9..d37f4e5b992c 100644 --- a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java +++ b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java @@ -103,7 +103,7 @@ public class LocalResourceManager extends ResourceManager { private static void collectResourceDirs(Module module, Set result) { VirtualFile resDir = AndroidRootUtil.getResourceDir(module); - if (resDir == null || !result.add(resDir)) { + if (resDir != null && !result.add(resDir)) { return; } for (AndroidFacet depFacet : AndroidUtils.getAllAndroidDependencies(module, false)) { diff --git a/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowForm.java b/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowForm.java index 5282ad2ff6a4..936e1a3dd00c 100644 --- a/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowForm.java +++ b/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowForm.java @@ -14,6 +14,7 @@ import com.android.sdklib.SdkConstants; import com.intellij.ide.ui.ListCellRendererWrapper; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.ex.CheckboxAction; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; @@ -60,6 +61,7 @@ class AndroidLayoutPreviewToolWindowForm implements Disposable { private static final Icon ZOOM_IN_ICON = IconLoader.getIcon("/icons/zoomIn.png"); private static final Icon ZOOM_OUT_ICON = IconLoader.getIcon("/icons/zoomOut.png"); private static final Icon ZOOM_ACTUAL_ICON = IconLoader.getIcon("/icons/zoomActual.png"); + private static final Icon REFRESH_ICON = IconLoader.getIcon("/icons/refreshPreview.png"); private static final String CUSTOM_DEVICE_STRING = "Edit..."; @@ -239,9 +241,26 @@ class AndroidLayoutPreviewToolWindowForm implements Disposable { actionGroup.add(new MyZoomActualAction()); actionGroup.add(new MyZoomInAction()); actionGroup.add(new MyZoomOutAction()); + actionGroup.add(new MyRefreshAction()); myActionToolBar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, actionGroup, true); myActionToolBar.setReservePlaceAutoPopupIcon(false); + final DefaultActionGroup optionsGroup = new DefaultActionGroup(); + final ActionToolbar optionsToolBar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, optionsGroup, true); + optionsToolBar.setReservePlaceAutoPopupIcon(false); + optionsToolBar.setSecondaryActionsTooltip("Options"); + optionsGroup.addAction(new CheckboxAction("Hide for non-layout files") { + @Override + public boolean isSelected(AnActionEvent e) { + return mySettings.getState().isHideForNonLayoutFiles(); + } + + @Override + public void setSelected(AnActionEvent e, boolean state) { + mySettings.getState().setHideForNonLayoutFiles(state); + } + }).setAsSecondary(true); + gb.gridx = 0; gb.gridy++; final JComponent toolbar = myActionToolBar.getComponent(); @@ -249,7 +268,11 @@ class AndroidLayoutPreviewToolWindowForm implements Disposable { toolBarWrapper.add(toolbar, BorderLayout.CENTER); toolBarWrapper.setPreferredSize(new Dimension(10, toolbar.getMinimumSize().height)); toolBarWrapper.setMinimumSize(new Dimension(10, toolbar.getMinimumSize().height)); - myComboPanel.add(toolBarWrapper, gb); + + final JPanel fullToolbarComponent = new JPanel(new BorderLayout()); + fullToolbarComponent.add(toolBarWrapper, BorderLayout.CENTER); + fullToolbarComponent.add(optionsToolBar.getComponent(), BorderLayout.EAST); + myComboPanel.add(fullToolbarComponent, gb); gb.fill = GridBagConstraints.HORIZONTAL; myThemeCombo = new ComboBox(); @@ -1199,4 +1222,15 @@ class AndroidLayoutPreviewToolWindowForm implements Disposable { myActionToolBar.updateActionsImmediately(); } } + + private class MyRefreshAction extends AnAction { + MyRefreshAction() { + super(AndroidBundle.message("android.layout.preview.zoom.actual.action.text"), null, REFRESH_ICON); + } + + @Override + public void actionPerformed(AnActionEvent e) { + myToolWindowManager.render(); + } + } } diff --git a/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowManager.java b/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowManager.java index 6f75736232d4..6391255a280b 100644 --- a/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowManager.java +++ b/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowManager.java @@ -175,7 +175,7 @@ public class AndroidLayoutPreviewToolWindowManager implements ProjectComponent { ((ToolWindowManagerEx)ToolWindowManager.getInstance(myProject)).addToolWindowManagerListener(new ToolWindowManagerAdapter() { private boolean myVisible = false; - + @Override public void stateChanged() { if (myProject.isDisposed()) { @@ -186,7 +186,7 @@ public class AndroidLayoutPreviewToolWindowManager implements ProjectComponent { if (window != null && window.isAvailable()) { final boolean visible = window.isVisible(); AndroidLayoutPreviewToolWindowSettings.getInstance(myProject).getState().setVisible(visible); - + if (visible && !myVisible) { render(); } @@ -243,16 +243,19 @@ public class AndroidLayoutPreviewToolWindowManager implements ProjectComponent { initToolWindow(); } + final AndroidLayoutPreviewToolWindowSettings settings = AndroidLayoutPreviewToolWindowSettings.getInstance(myProject); + final boolean hideForNonLayoutFiles = settings.getState().isHideForNonLayoutFiles(); + if (activeEditor == null) { myToolWindowForm.setFile(null); - myToolWindow.setAvailable(false, null); + myToolWindow.setAvailable(!hideForNonLayoutFiles, null); return; } final PsiFile psiFile = PsiDocumentManager.getInstance(myProject).getPsiFile(activeEditor.getDocument()); if (psiFile == null) { myToolWindowForm.setFile(null); - myToolWindow.setAvailable(false, null); + myToolWindow.setAvailable(!hideForNonLayoutFiles, null); return; } diff --git a/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowSettings.java b/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowSettings.java index af68bad650c1..96d641a1d1ae 100644 --- a/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowSettings.java +++ b/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowSettings.java @@ -43,6 +43,7 @@ public class AndroidLayoutPreviewToolWindowSettings implements PersistentStateCo private String myLocaleLanguage; private String myLocaleRegion; private boolean myVisible = true; + private boolean myHideForNonLayoutFiles = true; public String getDevice() { return myDevice; @@ -115,5 +116,13 @@ public class AndroidLayoutPreviewToolWindowSettings implements PersistentStateCo public void setVisible(boolean visible) { myVisible = visible; } + + public boolean isHideForNonLayoutFiles() { + return myHideForNonLayoutFiles; + } + + public void setHideForNonLayoutFiles(boolean hideForNonLayoutFiles) { + myHideForNonLayoutFiles = hideForNonLayoutFiles; + } } } diff --git a/plugins/android/testData/libModule/highlighting.xml b/plugins/android/testData/libModule/highlighting.xml index 74d7e7439b94..61c7e56e4bfa 100644 --- a/plugins/android/testData/libModule/highlighting.xml +++ b/plugins/android/testData/libModule/highlighting.xml @@ -1,4 +1,4 @@ - -