mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Profile
This commit is contained in:
+4
-2
@@ -132,10 +132,12 @@ public class ProfileAction {
|
||||
dialog.show();
|
||||
|
||||
if (dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) {
|
||||
// TODO: send event to manager's
|
||||
|
||||
myProfileList.setProfiles(dialog.getResult());
|
||||
updateActions();
|
||||
}
|
||||
}
|
||||
|
||||
public void externalUpdate() {
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
+36
-24
@@ -54,6 +54,7 @@ import com.intellij.util.ThrowableRunnable;
|
||||
import org.jetbrains.android.facet.AndroidFacet;
|
||||
import org.jetbrains.android.sdk.AndroidPlatform;
|
||||
import org.jetbrains.android.uipreview.*;
|
||||
import org.jetbrains.android.util.AndroidSdkNotConfiguredException;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -247,8 +248,6 @@ public final class AndroidDesignerEditorPanel extends DesignerEditorPanel {
|
||||
|
||||
|
||||
private void createRenderer(final String layoutXmlText, final ThrowableRunnable<Throwable> runnable) throws Exception {
|
||||
// TODO: (profile|device|target|...|theme) panel
|
||||
|
||||
if (mySession == null) {
|
||||
ApplicationManager.getApplication().invokeLater(
|
||||
new Runnable() {
|
||||
@@ -273,29 +272,33 @@ public final class AndroidDesignerEditorPanel extends DesignerEditorPanel {
|
||||
ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
AndroidPlatform platform = AndroidPlatform.getInstance(myModule);
|
||||
IAndroidTarget target = platform.getTarget();
|
||||
AndroidFacet facet = AndroidFacet.getInstance(myModule);
|
||||
|
||||
LayoutDeviceManager layoutDeviceManager = new LayoutDeviceManager();
|
||||
layoutDeviceManager.loadDevices(platform.getSdkData());
|
||||
LayoutDevice layoutDevice = layoutDeviceManager.getCombinedList().get(0);
|
||||
|
||||
LayoutDeviceConfiguration deviceConfiguration = layoutDevice.getConfigurations().get(0);
|
||||
|
||||
FolderConfiguration config = new FolderConfiguration();
|
||||
config.set(deviceConfiguration.getConfiguration());
|
||||
config.setUiModeQualifier(new UiModeQualifier(UiMode.NORMAL));
|
||||
config.setNightModeQualifier(new NightModeQualifier(NightMode.NIGHT));
|
||||
config.setLanguageQualifier(new LanguageQualifier());
|
||||
config.setRegionQualifier(new RegionQualifier());
|
||||
|
||||
float xdpi = deviceConfiguration.getDevice().getXDpi();
|
||||
float ydpi = deviceConfiguration.getDevice().getYDpi();
|
||||
|
||||
ThemeData theme = new ThemeData("Theme", false);
|
||||
|
||||
try {
|
||||
AndroidPlatform platform = AndroidPlatform.getInstance(myModule);
|
||||
if (platform == null) {
|
||||
throw new AndroidSdkNotConfiguredException();
|
||||
}
|
||||
|
||||
IAndroidTarget target = platform.getTarget();
|
||||
AndroidFacet facet = AndroidFacet.getInstance(myModule);
|
||||
|
||||
LayoutDeviceManager layoutDeviceManager = new LayoutDeviceManager();
|
||||
layoutDeviceManager.loadDevices(platform.getSdkData());
|
||||
LayoutDevice layoutDevice = layoutDeviceManager.getCombinedList().get(0);
|
||||
|
||||
LayoutDeviceConfiguration deviceConfiguration = layoutDevice.getConfigurations().get(0);
|
||||
|
||||
FolderConfiguration config = new FolderConfiguration();
|
||||
config.set(deviceConfiguration.getConfiguration());
|
||||
config.setUiModeQualifier(new UiModeQualifier(UiMode.NORMAL));
|
||||
config.setNightModeQualifier(new NightModeQualifier(NightMode.NIGHT));
|
||||
config.setLanguageQualifier(new LanguageQualifier());
|
||||
config.setRegionQualifier(new RegionQualifier());
|
||||
|
||||
float xdpi = deviceConfiguration.getDevice().getXDpi();
|
||||
float ydpi = deviceConfiguration.getDevice().getYDpi();
|
||||
|
||||
ThemeData theme = new ThemeData("Theme", false);
|
||||
|
||||
mySession = RenderUtil.createRenderSession(getProject(), layoutXmlText, myFile, target, facet, config, xdpi, ydpi, theme);
|
||||
|
||||
ApplicationManager.getApplication().invokeLater(new Runnable() {
|
||||
@@ -336,6 +339,15 @@ public final class AndroidDesignerEditorPanel extends DesignerEditorPanel {
|
||||
super.showError(message, e);
|
||||
}
|
||||
|
||||
public ProfileAction getProfileAction() {
|
||||
return myProfileAction;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void activate() {
|
||||
myProfileAction.externalUpdate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
myPSIChangeListener.stop();
|
||||
|
||||
@@ -75,6 +75,7 @@ public class ProfileDialog extends DialogWrapper {
|
||||
myProfileModel.add(new ProfileWrapper(profile));
|
||||
}
|
||||
|
||||
// TODO: DND reorder elements
|
||||
myProfileList = new JBList();
|
||||
myProfileList.setModel(myProfileModel);
|
||||
myProfileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
|
||||
+110
-32
@@ -15,85 +15,163 @@
|
||||
*/
|
||||
package com.intellij.android.designer.profile;
|
||||
|
||||
import com.intellij.ProjectTopics;
|
||||
import com.intellij.android.designer.designSurface.AndroidDesignerEditorPanel;
|
||||
import com.intellij.designer.DesignerToolWindowManager;
|
||||
import com.intellij.designer.designSurface.DesignerEditorPanel;
|
||||
import com.intellij.openapi.components.PersistentStateComponent;
|
||||
import com.intellij.openapi.components.ServiceManager;
|
||||
import com.intellij.openapi.components.State;
|
||||
import com.intellij.openapi.components.Storage;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.util.xmlb.XmlSerializerUtil;
|
||||
import com.intellij.openapi.projectRoots.Sdk;
|
||||
import com.intellij.openapi.roots.ModuleRootEvent;
|
||||
import com.intellij.openapi.roots.ModuleRootListener;
|
||||
import com.intellij.openapi.roots.ModuleRootManager;
|
||||
import com.intellij.util.xmlb.annotations.AbstractCollection;
|
||||
import com.intellij.util.xmlb.annotations.Tag;
|
||||
import com.intellij.util.xmlb.annotations.Transient;
|
||||
import org.jetbrains.android.sdk.AndroidPlatform;
|
||||
import org.jetbrains.android.sdk.AndroidSdkAdditionalData;
|
||||
import org.jetbrains.android.sdk.AndroidSdkType;
|
||||
import org.jetbrains.android.uipreview.LayoutDeviceManager;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Alexander Lobas
|
||||
* @author Eugene.Kudelevsky
|
||||
*/
|
||||
@State(name = "AndroidDesignerProfile", storages = {@Storage(file = "$WORKSPACE_FILE$")})
|
||||
public class ProfileList implements PersistentStateComponent<ProfileList> {
|
||||
private List<Profile> myProfiles = new ArrayList<Profile>();
|
||||
private Profile myFullProfile = new Profile();
|
||||
private String mySelection = "";
|
||||
@Transient
|
||||
public class ProfileList implements PersistentStateComponent<ProfileList.ProfileState> {
|
||||
private final LayoutDeviceManager myLayoutDeviceManager = new LayoutDeviceManager();
|
||||
private final Map<Module, Sdk> myModule2Sdk = new HashMap<Module, Sdk>();
|
||||
private ProfileState myState = new ProfileState();
|
||||
private final Project myProject;
|
||||
|
||||
public ProfileList(Project project) {
|
||||
myProject = project;
|
||||
updateModules();
|
||||
project.getMessageBus().connect(project).subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootListener() {
|
||||
@Override
|
||||
public void beforeRootsChange(ModuleRootEvent event) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rootsChanged(ModuleRootEvent event) {
|
||||
updatePlatform();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static ProfileList getInstance(Project project) {
|
||||
return ServiceManager.getService(project, ProfileList.class);
|
||||
}
|
||||
|
||||
@Tag("profiles")
|
||||
@AbstractCollection(surroundWithTag = false)
|
||||
public Sdk getModuleSdk(Module module) {
|
||||
return myModule2Sdk.get(module);
|
||||
}
|
||||
|
||||
private void updateModules() {
|
||||
myModule2Sdk.clear();
|
||||
for (Module module : ModuleManager.getInstance(myProject).getModules()) {
|
||||
myModule2Sdk.put(module, ModuleRootManager.getInstance(module).getSdk());
|
||||
}
|
||||
}
|
||||
|
||||
private void updatePlatform() {
|
||||
DesignerEditorPanel designer = DesignerToolWindowManager.getInstance(myProject).getActiveDesigner();
|
||||
if (designer instanceof AndroidDesignerEditorPanel) {
|
||||
Module module = designer.getModule();
|
||||
Sdk prevSdk = myModule2Sdk.get(module);
|
||||
Sdk newSdk = ModuleRootManager.getInstance(module).getSdk();
|
||||
if (newSdk != null
|
||||
&& (newSdk.getSdkType() instanceof AndroidSdkType ||
|
||||
(prevSdk != null && prevSdk.getSdkType() instanceof AndroidSdkType))
|
||||
&& !newSdk.equals(prevSdk)) {
|
||||
|
||||
AndroidSdkAdditionalData additionalData = (AndroidSdkAdditionalData)newSdk.getSdkAdditionalData();
|
||||
AndroidPlatform newPlatform = additionalData != null ? additionalData.getAndroidPlatform() : null;
|
||||
((AndroidDesignerEditorPanel)designer).getProfileAction().getProfileManager().update(newPlatform);
|
||||
}
|
||||
}
|
||||
|
||||
updateModules();
|
||||
}
|
||||
|
||||
public List<Profile> getProfiles() {
|
||||
return myProfiles;
|
||||
return myState.getProfiles();
|
||||
}
|
||||
|
||||
public void setProfiles(List<Profile> profiles) {
|
||||
myProfiles = profiles;
|
||||
}
|
||||
|
||||
public String getSelection() {
|
||||
return mySelection;
|
||||
myState.setProfiles(profiles);
|
||||
}
|
||||
|
||||
public void setSelection(String selection) {
|
||||
mySelection = selection;
|
||||
myState.setSelection(selection);
|
||||
}
|
||||
|
||||
public Profile getFullProfile() {
|
||||
return myFullProfile;
|
||||
return myState.getFullProfile();
|
||||
}
|
||||
|
||||
public void setFullProfile(Profile fullProfile) {
|
||||
myFullProfile = fullProfile;
|
||||
}
|
||||
|
||||
@Transient
|
||||
public LayoutDeviceManager getLayoutDeviceManager() {
|
||||
return myLayoutDeviceManager;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Transient
|
||||
public Profile getProfile() {
|
||||
for (Profile profile : myProfiles) {
|
||||
if (mySelection.equals(profile.getName())) {
|
||||
String selection = myState.getSelection();
|
||||
for (Profile profile : getProfiles()) {
|
||||
if (selection.equals(profile.getName())) {
|
||||
return profile;
|
||||
}
|
||||
}
|
||||
return myFullProfile;
|
||||
return getFullProfile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProfileList getState() {
|
||||
return this;
|
||||
public ProfileState getState() {
|
||||
return myState;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadState(ProfileList state) {
|
||||
XmlSerializerUtil.copyBean(state, this);
|
||||
public void loadState(ProfileState state) {
|
||||
myState = state;
|
||||
}
|
||||
|
||||
public static class ProfileState {
|
||||
private List<Profile> myProfiles = new ArrayList<Profile>();
|
||||
private Profile myFullProfile = new Profile();
|
||||
private String mySelection = "";
|
||||
|
||||
@Tag("profiles")
|
||||
@AbstractCollection(surroundWithTag = false)
|
||||
public List<Profile> getProfiles() {
|
||||
return myProfiles;
|
||||
}
|
||||
|
||||
public void setProfiles(List<Profile> profiles) {
|
||||
myProfiles = profiles;
|
||||
}
|
||||
|
||||
public String getSelection() {
|
||||
return mySelection;
|
||||
}
|
||||
|
||||
public void setSelection(String selection) {
|
||||
mySelection = selection;
|
||||
}
|
||||
|
||||
public Profile getFullProfile() {
|
||||
return myFullProfile;
|
||||
}
|
||||
|
||||
public void setFullProfile(Profile fullProfile) {
|
||||
myFullProfile = fullProfile;
|
||||
}
|
||||
}
|
||||
}
|
||||
+10
-25
@@ -22,8 +22,6 @@ import com.android.resources.NightMode;
|
||||
import com.android.resources.UiMode;
|
||||
import com.android.sdklib.IAndroidTarget;
|
||||
import com.intellij.designer.actions.AbstractComboBoxAction;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.actionSystem.DefaultActionGroup;
|
||||
import com.intellij.openapi.actionSystem.Presentation;
|
||||
import com.intellij.openapi.module.Module;
|
||||
@@ -176,32 +174,20 @@ public class ProfileManager {
|
||||
};
|
||||
|
||||
myThemeAction = new AbstractComboBoxAction<ThemeData>() {
|
||||
@Override
|
||||
protected boolean addSeparator(DefaultActionGroup actionGroup, ThemeData item) {
|
||||
if (item == ThemeManager.FRAMEWORK || item == ThemeManager.PROJECT) {
|
||||
// TODO: ???????
|
||||
actionGroup.add(new AnAction("") {
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent e) {
|
||||
}
|
||||
});
|
||||
actionGroup.addSeparator(item.getName());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void update(ThemeData theme, Presentation presentation, boolean popup) {
|
||||
presentation.setEnabled(theme != null);
|
||||
presentation.setEnabled(theme != null && theme != ThemeManager.FRAMEWORK && theme != ThemeManager.PROJECT);
|
||||
|
||||
if (theme != null) {
|
||||
if (!theme.isProjectTheme() && myThemeManager.getAddedThemes().contains(new ThemeData(theme.getName(), true))) {
|
||||
if (!popup && !theme.isProjectTheme() && myThemeManager.getAddedThemes().contains(new ThemeData(theme.getName(), true))) {
|
||||
presentation.setText(theme.getName() + " (framework)");
|
||||
}
|
||||
else {
|
||||
else if (!popup || theme == ThemeManager.FRAMEWORK || theme == ThemeManager.PROJECT) {
|
||||
presentation.setText(theme.getName());
|
||||
}
|
||||
else {
|
||||
presentation.setText(" " + theme.getName());
|
||||
}
|
||||
}
|
||||
else {
|
||||
presentation.setText("[None]");
|
||||
@@ -220,6 +206,7 @@ public class ProfileManager {
|
||||
return 20; // TODO: not worked
|
||||
}
|
||||
};
|
||||
myThemeAction.showDisabledActions(true);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -242,8 +229,6 @@ public class ProfileManager {
|
||||
}
|
||||
else {
|
||||
update(getPlatform());
|
||||
myDockModeAction.setItems(Arrays.asList(UiMode.values()), UiMode.getEnum(myProfile.getDockMode()));
|
||||
myNightModeAction.setItems(Arrays.asList(NightMode.values()), NightMode.getEnum(myProfile.getNightMode()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,6 +247,8 @@ public class ProfileManager {
|
||||
updateLocales();
|
||||
updatePlatform(platform);
|
||||
updateThemes();
|
||||
myDockModeAction.setItems(Arrays.asList(UiMode.values()), UiMode.getEnum(myProfile.getDockMode()));
|
||||
myNightModeAction.setItems(Arrays.asList(NightMode.values()), NightMode.getEnum(myProfile.getNightMode()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -559,9 +546,6 @@ public class ProfileManager {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (newTheme == null) {
|
||||
System.out.println("Theme: " + themeName + " not found");
|
||||
}
|
||||
}
|
||||
if (newTheme == null && !themes.isEmpty()) {
|
||||
for (ThemeData theme : themes) {
|
||||
@@ -573,6 +557,7 @@ public class ProfileManager {
|
||||
}
|
||||
|
||||
myThemeAction.setItems(themes, newTheme);
|
||||
myThemeAction.update();
|
||||
updateTheme(newTheme);
|
||||
myRefreshAction.run();
|
||||
}
|
||||
|
||||
+32
-5
@@ -15,11 +15,11 @@
|
||||
*/
|
||||
package com.intellij.designer.actions;
|
||||
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.actionSystem.DefaultActionGroup;
|
||||
import com.intellij.openapi.actionSystem.Presentation;
|
||||
import com.intellij.openapi.actionSystem.*;
|
||||
import com.intellij.openapi.actionSystem.ex.ComboBoxAction;
|
||||
import com.intellij.openapi.ui.popup.JBPopupFactory;
|
||||
import com.intellij.openapi.ui.popup.ListPopup;
|
||||
import com.intellij.openapi.util.IconLoader;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -32,9 +32,12 @@ import java.util.List;
|
||||
* @author Alexander Lobas
|
||||
*/
|
||||
public abstract class AbstractComboBoxAction<T> extends ComboBoxAction {
|
||||
private static final Icon CHECKED = IconLoader.getIcon("/actions/check.png");
|
||||
|
||||
private List<T> myItems = Collections.emptyList();
|
||||
private T mySelection;
|
||||
private Presentation myPresentation;
|
||||
private boolean myShowDisabledActions;
|
||||
|
||||
public void setItems(List<T> items, @Nullable T selection) {
|
||||
myItems = items;
|
||||
@@ -57,6 +60,10 @@ public abstract class AbstractComboBoxAction<T> extends ComboBoxAction {
|
||||
update();
|
||||
}
|
||||
|
||||
public void showDisabledActions(boolean value) {
|
||||
myShowDisabledActions = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JComponent createCustomComponent(Presentation presentation) {
|
||||
myPresentation = presentation;
|
||||
@@ -69,6 +76,23 @@ public abstract class AbstractComboBoxAction<T> extends ComboBoxAction {
|
||||
return panel;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ComboBoxButton createComboBoxButton(Presentation presentation) {
|
||||
if (myShowDisabledActions) {
|
||||
return new ComboBoxButton(presentation) {
|
||||
@Override
|
||||
protected ListPopup createPopup(Runnable onDispose) {
|
||||
ListPopup popup = JBPopupFactory.getInstance().createActionGroupPopup(
|
||||
null, createPopupActionGroup(this), getDataContext(), JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, true, onDispose,
|
||||
getMaxRows());
|
||||
popup.setMinimumSize(new Dimension(getMinWidth(), getMinHeight()));
|
||||
return popup;
|
||||
}
|
||||
};
|
||||
}
|
||||
return super.createComboBoxButton(presentation);
|
||||
}
|
||||
|
||||
public void update() {
|
||||
update(mySelection, myPresentation, false);
|
||||
}
|
||||
@@ -92,8 +116,11 @@ public abstract class AbstractComboBoxAction<T> extends ComboBoxAction {
|
||||
}
|
||||
}
|
||||
};
|
||||
update(item, action.getTemplatePresentation(), true);
|
||||
actionGroup.add(action);
|
||||
|
||||
Presentation presentation = action.getTemplatePresentation();
|
||||
presentation.setIcon(mySelection == item ? CHECKED : null);
|
||||
update(item, presentation, true);
|
||||
}
|
||||
|
||||
return actionGroup;
|
||||
|
||||
+26
-7
@@ -26,10 +26,6 @@ import com.intellij.util.containers.hash.HashSet;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.ComponentListener;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@@ -89,11 +85,34 @@ public class DesignerActionPanel implements DataProvider {
|
||||
}
|
||||
|
||||
public void update() {
|
||||
myToolbar.setVisible(myActionGroup.getChildrenCount() > 0);
|
||||
boolean oldVisible = myToolbar.isVisible();
|
||||
boolean newVisible = isVisible(myActionGroup);
|
||||
myToolbar.setVisible(newVisible);
|
||||
if (oldVisible && newVisible) {
|
||||
((JComponent)myToolbar.getParent()).revalidate();
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isVisible(DefaultActionGroup group) {
|
||||
if (group.getChildrenCount() == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (AnAction action : group.getChildren(null)) {
|
||||
if (action instanceof DefaultActionGroup) {
|
||||
if (isVisible((DefaultActionGroup)action)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void updateSelectionActions(List<RadComponent> selection) {
|
||||
boolean update = myDynamicGroup.getChildrenCount() > 0;
|
||||
boolean update = isVisible(myDynamicGroup);
|
||||
|
||||
for (AnAction action : myDynamicGroup.getChildActionsOrStubs()) {
|
||||
action.unregisterCustomShortcutSet(myShortcuts);
|
||||
@@ -114,7 +133,7 @@ public class DesignerActionPanel implements DataProvider {
|
||||
for (RadComponent component : selection) {
|
||||
component.addSelectionActions(myDynamicGroup, myShortcuts, selection);
|
||||
}
|
||||
update |= myDynamicGroup.getChildrenCount() > 0;
|
||||
update |= isVisible(myDynamicGroup);
|
||||
|
||||
if (update) {
|
||||
update();
|
||||
|
||||
Reference in New Issue
Block a user