Move ConfigComposite in its own package.

This commit is contained in:
Xavier Ducrohet
2009-08-19 18:18:37 -07:00
parent ffb7b7f81d
commit 900234fc0a
2 changed files with 80 additions and 74 deletions

View File

@@ -18,9 +18,10 @@ package com.android.ide.eclipse.adt.internal.editors.layout;
import com.android.ide.eclipse.adt.AdtPlugin; import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.editors.IconFactory; import com.android.ide.eclipse.adt.internal.editors.IconFactory;
import com.android.ide.eclipse.adt.internal.editors.layout.ConfigurationComposite.IConfigListener;
import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.UiEditorActions; import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.UiEditorActions;
import com.android.ide.eclipse.adt.internal.editors.layout.LayoutReloadMonitor.ILayoutReloadListener; import com.android.ide.eclipse.adt.internal.editors.layout.LayoutReloadMonitor.ILayoutReloadListener;
import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationComposite;
import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationComposite.IConfigListener;
import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor; import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
import com.android.ide.eclipse.adt.internal.editors.layout.parts.ElementCreateCommand; import com.android.ide.eclipse.adt.internal.editors.layout.parts.ElementCreateCommand;
import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiElementEditPart; import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiElementEditPart;
@@ -29,25 +30,9 @@ import com.android.ide.eclipse.adt.internal.editors.ui.tree.CopyCutAction;
import com.android.ide.eclipse.adt.internal.editors.ui.tree.PasteAction; import com.android.ide.eclipse.adt.internal.editors.ui.tree.PasteAction;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode; import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode; import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
import com.android.ide.eclipse.adt.internal.resources.ResourceType;
import com.android.ide.eclipse.adt.internal.resources.configurations.CountryCodeQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration; import com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration;
import com.android.ide.eclipse.adt.internal.resources.configurations.KeyboardStateQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.LanguageQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.NavigationMethodQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.NetworkCodeQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier; import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.RegionQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenDimensionQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenOrientationQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.TextInputMethodQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.TouchScreenQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.KeyboardStateQualifier.KeyboardState;
import com.android.ide.eclipse.adt.internal.resources.configurations.NavigationMethodQualifier.NavigationMethod;
import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier.Density; import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier.Density;
import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenOrientationQualifier.ScreenOrientation;
import com.android.ide.eclipse.adt.internal.resources.configurations.TextInputMethodQualifier.TextInputMethod;
import com.android.ide.eclipse.adt.internal.resources.configurations.TouchScreenQualifier.TouchScreenType;
import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources; import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
import com.android.ide.eclipse.adt.internal.resources.manager.ResourceFile; import com.android.ide.eclipse.adt.internal.resources.manager.ResourceFile;
import com.android.ide.eclipse.adt.internal.resources.manager.ResourceFolderType; import com.android.ide.eclipse.adt.internal.resources.manager.ResourceFolderType;
@@ -57,14 +42,10 @@ import com.android.ide.eclipse.adt.internal.sdk.LoadStatus;
import com.android.ide.eclipse.adt.internal.sdk.Sdk; import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData.LayoutBridge; import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData.LayoutBridge;
import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener; import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener;
import com.android.ide.eclipse.adt.internal.ui.ConfigurationSelector.DimensionVerifier;
import com.android.ide.eclipse.adt.internal.ui.ConfigurationSelector.LanguageRegionVerifier;
import com.android.ide.eclipse.adt.internal.ui.ConfigurationSelector.MobileCodeVerifier;
import com.android.layoutlib.api.ILayoutLog; import com.android.layoutlib.api.ILayoutLog;
import com.android.layoutlib.api.ILayoutResult; import com.android.layoutlib.api.ILayoutResult;
import com.android.layoutlib.api.IProjectCallback; import com.android.layoutlib.api.IProjectCallback;
import com.android.layoutlib.api.IResourceValue; import com.android.layoutlib.api.IResourceValue;
import com.android.layoutlib.api.IStyleResourceValue;
import com.android.layoutlib.api.IXmlPullParser; import com.android.layoutlib.api.IXmlPullParser;
import com.android.layoutlib.api.ILayoutResult.ILayoutViewInfo; import com.android.layoutlib.api.ILayoutResult.ILayoutViewInfo;
import com.android.sdklib.IAndroidTarget; import com.android.sdklib.IAndroidTarget;
@@ -98,22 +79,12 @@ import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.PartInitException; import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IDE; import org.eclipse.ui.ide.IDE;
@@ -128,12 +99,9 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* Graphical layout editor, based on GEF. * Graphical layout editor, based on GEF.
@@ -168,7 +136,6 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
private boolean mNeedsXmlReload = false; private boolean mNeedsXmlReload = false;
private boolean mNeedsRecompute = false; private boolean mNeedsRecompute = false;
private int mPlatformThemeCount = 0;
/** Listener to update the root node if the target of the file is changed because of a /** Listener to update the root node if the target of the file is changed because of a
* SDK location change or a project target change */ * SDK location change or a project target change */
@@ -239,7 +206,7 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
gl.marginHeight = gl.marginWidth = 0; gl.marginHeight = gl.marginWidth = 0;
// create the top part for the configuration control // create the top part for the configuration control
mConfigComposite = new ConfigurationComposite(parent, SWT.NONE); mConfigComposite = new ConfigurationComposite(this, parent, SWT.NONE);
// create a new composite that will contain the standard editor controls. // create a new composite that will contain the standard editor controls.
Composite editorParent = new Composite(parent, SWT.NONE); Composite editorParent = new Composite(parent, SWT.NONE);
@@ -552,7 +519,7 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
setConfiguration(configuration, true /*force*/); setConfiguration(configuration, true /*force*/);
// enable the create button if the current and edited config are not equals // enable the create button if the current and edited config are not equals
mCreateButton.setEnabled( mConfigComposite.setEnabledCreate(
mEditedConfig.equals(mConfigComposite.getCurrentConfig()) == false); mEditedConfig.equals(mConfigComposite.getCurrentConfig()) == false);
} }
@@ -602,7 +569,8 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
projectRes.loadAll(); projectRes.loadAll();
// get the project resource values based on the current config // get the project resource values based on the current config
mConfiguredProjectRes = projectRes.getConfiguredResources(mCurrentConfig); mConfiguredProjectRes = projectRes.getConfiguredResources(
mConfigComposite.getCurrentConfig());
} }
configuredProjectResources = mConfiguredProjectRes; configuredProjectResources = mConfiguredProjectRes;
@@ -617,17 +585,15 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
if (configuredProjectResources != null && frameworkResources != null) { if (configuredProjectResources != null && frameworkResources != null) {
// get the selected theme // get the selected theme
int themeIndex = mThemeCombo.getSelectionIndex(); String theme = mConfigComposite.getTheme();
if (themeIndex != -1) { if (theme != null) {
String theme = mThemeCombo.getItem(themeIndex);
// Render a single object as described by the ViewElementDescriptor. // Render a single object as described by the ViewElementDescriptor.
WidgetPullParser parser = new WidgetPullParser(descriptor); WidgetPullParser parser = new WidgetPullParser(descriptor);
ILayoutResult result = computeLayout(bridge, parser, ILayoutResult result = computeLayout(bridge, parser,
null /* projectKey */, null /* projectKey */,
300 /* width */, 300 /* height */, 160 /*density*/, 300 /* width */, 300 /* height */, 160 /*density*/,
160.f /*xdpi*/, 160.f /*ydpi*/, theme, 160.f /*xdpi*/, 160.f /*ydpi*/, theme,
themeIndex >= mPlatformThemeCount /*isProjectTheme*/, mConfigComposite.isProjectTheme(),
configuredProjectResources, frameworkResources, projectCallback, configuredProjectResources, frameworkResources, projectCallback,
null /* logger */); null /* logger */);
@@ -785,7 +751,7 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
setConfiguration(mEditedConfig, false /*force*/); setConfiguration(mEditedConfig, false /*force*/);
// enable the create button if the current and edited config are not equals // enable the create button if the current and edited config are not equals
mCreateButton.setEnabled( mConfigComposite.setEnabledCreate(
mEditedConfig.equals(mConfigComposite.getCurrentConfig()) == false); mEditedConfig.equals(mConfigComposite.getCurrentConfig()) == false);
// Even though the layout doesn't change, the config changed, and referenced // Even though the layout doesn't change, the config changed, and referenced
@@ -796,13 +762,14 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
mConfigComposite.displayConfigError(); mConfigComposite.displayConfigError();
// enable the Create button // enable the Create button
mCreateButton.setEnabled(true); mConfigComposite.setEnabledCreate(true);
// display the error. // display the error.
FolderConfiguration currentConfig = mConfigComposite.getCurrentConfig();
String message = String.format( String message = String.format(
"No resources match the configuration\n \n\t%1$s\n \nChange the configuration or create:\n \n\tres/%2$s/%3$s\n \nYou can also click the 'Create' button above.", "No resources match the configuration\n \n\t%1$s\n \nChange the configuration or create:\n \n\tres/%2$s/%3$s\n \nYou can also click the 'Create' button above.",
mCurrentConfig.toDisplayString(), currentConfig.toDisplayString(),
mCurrentConfig.getFolderName(ResourceFolderType.LAYOUT, currentConfig.getFolderName(ResourceFolderType.LAYOUT,
Sdk.getCurrent().getTarget(mEditedFile.getProject())), Sdk.getCurrent().getTarget(mEditedFile.getProject())),
mEditedFile.getName()); mEditedFile.getName());
showErrorInEditor(message); showErrorInEditor(message);
@@ -902,20 +869,14 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
} }
// get the resources of the file's project. // get the resources of the file's project.
if (mConfiguredProjectRes == null) { Map<String, Map<String, IResourceValue>> configuredProjectRes =
// make sure they are loaded getConfiguredProjectResources();
projectRes.loadAll();
// get the project resource values based on the current config
mConfiguredProjectRes = projectRes.getConfiguredResources(
mConfigComposite.getCurrentConfig());
}
// get the framework resources // get the framework resources
Map<String, Map<String, IResourceValue>> frameworkResources = Map<String, Map<String, IResourceValue>> frameworkResources =
getConfiguredFrameworkResources(); getConfiguredFrameworkResources();
if (mConfiguredProjectRes != null && frameworkResources != null) { if (configuredProjectRes != null && frameworkResources != null) {
if (mProjectCallback == null) { if (mProjectCallback == null) {
mProjectCallback = new ProjectCallback( mProjectCallback = new ProjectCallback(
bridge.classLoader, projectRes, iProject); bridge.classLoader, projectRes, iProject);
@@ -944,19 +905,19 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
} }
// get the selected theme // get the selected theme
int themeIndex = mThemeCombo.getSelectionIndex(); String theme = mConfigComposite.getTheme();
if (themeIndex != -1) { if (theme != null) {
String theme = mThemeCombo.getItem(themeIndex);
// Compute the layout // Compute the layout
UiElementPullParser parser = new UiElementPullParser(getModel()); UiElementPullParser parser = new UiElementPullParser(getModel());
Rectangle rect = getBounds(); Rectangle rect = getBounds();
boolean isProjectTheme = themeIndex >= mPlatformThemeCount; boolean isProjectTheme = mConfigComposite.isProjectTheme();
// FIXME pass the density/dpi from somewhere (resource config or skin). // FIXME pass the density/dpi from somewhere (resource config or skin).
// For now, get it from the config // For now, get it from the config
int density = Density.MEDIUM.getDpiValue(); int density = Density.MEDIUM.getDpiValue();
PixelDensityQualifier qual = mCurrentConfig.getPixelDensityQualifier(); PixelDensityQualifier qual =
mConfigComposite.getCurrentConfig().getPixelDensityQualifier();
if (qual != null) { if (qual != null) {
int d = qual.getValue().getDpiValue(); int d = qual.getValue().getDpiValue();
if (d > 0) { if (d > 0) {
@@ -968,7 +929,7 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
iProject /* projectKey */, iProject /* projectKey */,
rect.width, rect.height, density, density, density, rect.width, rect.height, density, density, density,
theme, isProjectTheme, theme, isProjectTheme,
mConfiguredProjectRes, frameworkResources, mProjectCallback, configuredProjectRes, frameworkResources, mProjectCallback,
mLogger); mLogger);
// update the UiElementNode with the layout info. // update the UiElementNode with the layout info.
@@ -1144,6 +1105,21 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
return mConfiguredFrameworkRes; return mConfiguredFrameworkRes;
} }
public Map<String, Map<String, IResourceValue>> getConfiguredProjectResources() {
if (mConfiguredProjectRes == null) {
ProjectResources project = getProjectResources();
// make sure they are loaded
project.loadAll();
// get the project resource values based on the current config
mConfiguredProjectRes = project.getConfiguredResources(
mConfigComposite.getCurrentConfig());
}
return mConfiguredProjectRes;
}
/** /**
* Returns a {@link ProjectResources} for the framework resources. * Returns a {@link ProjectResources} for the framework resources.
* @return the framework resources or null if not found. * @return the framework resources or null if not found.
@@ -1167,6 +1143,15 @@ public class GraphicalLayoutEditor extends AbstractGraphicalLayoutEditor
return null; return null;
} }
public ProjectResources getProjectResources() {
if (mEditedFile != null) {
ResourceManager manager = ResourceManager.getInstance();
return manager.getProjectResources(mEditedFile.getProject());
}
return null;
}
/** /**
* Creates a new layout file from the specified {@link FolderConfiguration}. * Creates a new layout file from the specified {@link FolderConfiguration}.
*/ */

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.ide.eclipse.adt.internal.editors.layout; package com.android.ide.eclipse.adt.internal.editors.layout.configuration;
import com.android.ide.eclipse.adt.internal.editors.IconFactory; import com.android.ide.eclipse.adt.internal.editors.IconFactory;
import com.android.ide.eclipse.adt.internal.resources.ResourceType; import com.android.ide.eclipse.adt.internal.resources.ResourceType;
@@ -106,8 +106,8 @@ public class ConfigurationComposite extends Composite {
private boolean mDisableUpdates = false; private boolean mDisableUpdates = false;
/** The {@link FolderConfiguration} representing the state of the UI controls */ /** The {@link FolderConfiguration} representing the state of the UI controls */
private FolderConfiguration mCurrentConfig = new FolderConfiguration(); private final FolderConfiguration mCurrentConfig = new FolderConfiguration();
private IConfigListener mListener; private final IConfigListener mListener;
public interface IConfigListener { public interface IConfigListener {
void onConfigurationChange(); void onConfigurationChange();
@@ -120,8 +120,9 @@ public class ConfigurationComposite extends Composite {
Map<String, Map<String, IResourceValue>> getConfiguredFrameworkResources(); Map<String, Map<String, IResourceValue>> getConfiguredFrameworkResources();
} }
public ConfigurationComposite(Composite parent, int style) { public ConfigurationComposite(IConfigListener listener, Composite parent, int style) {
super(parent, style); super(parent, style);
mListener = listener;
IconFactory factory = IconFactory.getInstance(); IconFactory factory = IconFactory.getInstance();
mWarningImage = factory.getIcon("warning"); //$NON-NLS-1$ mWarningImage = factory.getIcon("warning"); //$NON-NLS-1$
@@ -406,15 +407,10 @@ public class ConfigurationComposite extends Composite {
} }
public void setOnConfigurationChange(IConfigListener listener) {
mListener = listener;
}
public void setConfig(FolderConfiguration config) { public void setConfig(FolderConfiguration config) {
mCurrentConfig.set(config); mCurrentConfig.set(config);
} }
public FolderConfiguration getCurrentConfig() { public FolderConfiguration getCurrentConfig() {
return mCurrentConfig; return mCurrentConfig;
} }
@@ -596,7 +592,31 @@ public class ConfigurationComposite extends Composite {
mThemeCombo.getParent().layout(); mThemeCombo.getParent().layout();
} }
/**
* Returns the current theme, or null if the combo has no selection.
*/
public String getTheme() {
int themeIndex = mThemeCombo.getSelectionIndex();
if (themeIndex != -1) {
return mThemeCombo.getItem(themeIndex);
}
return null;
}
/**
* Returns whether the current theme selection is a project theme.
* <p/>The returned value is meaningless if {@link #getTheme()} returns <code>null</code>.
* @return true for project theme, false for framework theme
*/
public boolean isProjectTheme() {
return mThemeCombo.getSelectionIndex() >= mPlatformThemeCount;
}
public void setEnabledCreate(boolean enabled) {
mCreateButton.setEnabled(enabled);
}
/** /**
* Update the UI controls state with a given {@link FolderConfiguration}. * Update the UI controls state with a given {@link FolderConfiguration}.
@@ -607,7 +627,7 @@ public class ConfigurationComposite extends Composite {
* @param config The {@link FolderConfiguration} to set. * @param config The {@link FolderConfiguration} to set.
* @param force Whether the UI should be changed to exactly match the received configuration. * @param force Whether the UI should be changed to exactly match the received configuration.
*/ */
void setConfiguration(FolderConfiguration config, boolean force) { public void setConfiguration(FolderConfiguration config, boolean force) {
mDisableUpdates = true; // we do not want to trigger onXXXChange when setting new values in the widgets. mDisableUpdates = true; // we do not want to trigger onXXXChange when setting new values in the widgets.
mCountryIcon.setImage(mMatchImage); mCountryIcon.setImage(mMatchImage);
@@ -678,7 +698,7 @@ public class ConfigurationComposite extends Composite {
Density.getIndex(densityQualifier.getValue()) + 1); Density.getIndex(densityQualifier.getValue()) + 1);
mCurrentConfig.setPixelDensityQualifier(densityQualifier); mCurrentConfig.setPixelDensityQualifier(densityQualifier);
} else if (force) { } else if (force) {
mOrientation.select(0); mDensity.select(0);
mCurrentConfig.setPixelDensityQualifier(null); mCurrentConfig.setPixelDensityQualifier(null);
} else if (mDensity.getSelectionIndex() != 0) { } else if (mDensity.getSelectionIndex() != 0) {
mDensityIcon.setImage(mWarningImage); mDensityIcon.setImage(mWarningImage);
@@ -757,7 +777,7 @@ public class ConfigurationComposite extends Composite {
/** /**
* Displays an error icon in front of all the non-null qualifiers. * Displays an error icon in front of all the non-null qualifiers.
*/ */
void displayConfigError() { public void displayConfigError() {
mCountryIcon.setImage(mMatchImage); mCountryIcon.setImage(mMatchImage);
CountryCodeQualifier countryQualifier = mCurrentConfig.getCountryCodeQualifier(); CountryCodeQualifier countryQualifier = mCurrentConfig.getCountryCodeQualifier();
if (countryQualifier != null) { if (countryQualifier != null) {
@@ -1244,4 +1264,5 @@ public class ConfigurationComposite extends Composite {
return false; return false;
} }
} }