diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonXmlDelegate.java')
-rwxr-xr-x | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonXmlDelegate.java | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonXmlDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonXmlDelegate.java new file mode 100755 index 000000000..d9ee8a5d8 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonXmlDelegate.java @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.eclipse.org/org/documents/epl-v10.php + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.adt.internal.editors.common; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor; +import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode; +import com.android.resources.ResourceFolderType; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.jface.text.contentassist.IContentAssistProcessor; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IURIEditorInput; +import org.eclipse.ui.forms.editor.IFormPage; +import org.eclipse.ui.part.EditorActionBarContributor; +import org.eclipse.ui.part.FileEditorInput; +import org.eclipse.ui.part.MultiPageEditorPart; +import org.w3c.dom.Document; + +/** + * Implementation of form editor for /res XML files. + * <p/> + * All delegates must have one {@link IDelegateCreator} instance + * registered in the {@code DELEGATES[]} array of {@link CommonXmlEditor}. + */ +public abstract class CommonXmlDelegate { + + /** The editor that created the delegate. Never null. */ + private final CommonXmlEditor mEditor; + + /** Root node of the UI element hierarchy. Can be null. */ + private UiElementNode mUiRootNode; + + private IContentAssistProcessor mContentAssist; + + /** + * Static creator for {@link CommonXmlDelegate}s. Delegates implement a method + * that will decide whether this delegate can be created for the given file input. + */ + public interface IDelegateCreator { + /** + * Determines whether this delegate can handle the given file, typically + * based on its resource path (e.g. ResourceManager#getResourceFolder). + * + * @param delegator The non-null instance of {@link CommonXmlEditor}. + * @param type The {@link ResourceFolderType} of the folder containing the file, + * if it can be determined. Null otherwise. + * @return A new delegate that can handle that file or null. + */ + public @Nullable <T extends CommonXmlDelegate> T createForFile( + @NonNull CommonXmlEditor delegator, + @Nullable ResourceFolderType type); + } + + /** Implemented by delegates that need to support {@link EditorActionBarContributor} */ + public interface IActionContributorDelegate { + /** Called from {@link EditorActionBarContributor#setActiveEditor(IEditorPart)}. */ + public void setActiveEditor(IEditorPart part, IActionBars bars); + } + + protected CommonXmlDelegate( + CommonXmlEditor editor, + IContentAssistProcessor contentAssist) { + mEditor = editor; + mContentAssist = contentAssist; + } + + public void dispose() { + } + + /** + * Returns the editor that created this delegate. + * + * @return the editor that created this delegate. Never null. + */ + public @NonNull CommonXmlEditor getEditor() { + return mEditor; + } + + /** + * @return The root node of the UI element hierarchy + */ + public UiElementNode getUiRootNode() { + return mUiRootNode; + } + + protected void setUiRootNode(UiElementNode uiRootNode) { + mUiRootNode = uiRootNode; + } + + /** Called to compute the initial {@code UiRootNode}. */ + public abstract void delegateInitUiRootNode(boolean force); + + /** + * Returns true, indicating the "save as" operation is supported by this editor. + */ + public boolean isSaveAsAllowed() { + return true; + } + + /** + * Create the various form pages. + */ + public abstract void delegateCreateFormPages(); + + public void delegatePostCreatePages() { + // pass + } + + /** + * Changes the tab/title name to include the project name. + */ + public void delegateSetInput(IEditorInput input) { + if (input instanceof FileEditorInput) { + FileEditorInput fileInput = (FileEditorInput) input; + IFile file = fileInput.getFile(); + getEditor().setPartName(file.getName()); + } else if (input instanceof IURIEditorInput) { + IURIEditorInput uriInput = (IURIEditorInput) input; + String name = uriInput.getName(); + getEditor().setPartName(name); + } + } + + /** + * Processes the new XML Model, which XML root node is given. + * + * @param xml_doc The XML document, if available, or null if none exists. + */ + public abstract void delegateXmlModelChanged(Document xml_doc); + + public void delegatePageChange(int newPageIndex) { + // pass + } + + public void delegatePostPageChange(int newPageIndex) { + // pass + } + /** + * Save the XML. + * <p/> + * The actual save operation is done in the super class by committing + * all data to the XML model and then having the Structured XML Editor + * save the XML. + * <p/> + * Here we just need to tell the graphical editor that the model has + * been saved. + */ + public void delegateDoSave(IProgressMonitor monitor) { + // pass + } + + /** + * Tells the editor to start a Lint check. + * It's up to the caller to check whether this should be done depending on preferences. + */ + public Job delegateRunLint() { + return getEditor().startLintJob(); + } + + + /** + * Returns the custom IContentOutlinePage or IPropertySheetPage when asked for it. + */ + public Object delegateGetAdapter(Class<?> adapter) { + return null; + } + + /** + * Returns the {@link IContentAssistProcessor} associated with this editor. + * Most implementations should lazily allocate one processor and always return the + * same instance. + * Must return null if there's no specific content assist processor for this editor. + */ + public IContentAssistProcessor getAndroidContentAssistProcessor() { + return mContentAssist; + } + + /** + * Does this editor participate in the "format GUI editor changes" option? + * + * @return false since editors do not support automatically formatting XML + * affected by GUI changes unless they explicitly opt in to it. + */ + public boolean delegateSupportsFormatOnGuiEdit() { + return false; + } + + /** + * Called after the editor's active page has been set. + * + * @param superReturned the return value from + * {@link MultiPageEditorPart#setActivePage(int)} + * @param pageIndex the index of the page to be activated; the index must be + * valid + * @return the page, or null + * @see MultiPageEditorPart#setActivePage(int) + */ + public IFormPage delegatePostSetActivePage(IFormPage superReturned, String pageIndex) { + return superReturned; + } + + /** Called after an editor has been activated */ + public void delegateActivated() { + } + + /** Called after an editor has been deactivated */ + public void delegateDeactivated() { + } + + /** + * Returns the name of the editor to be shown in the editor tab etc. Return + * null to keep the default. + * + * @return the part name, or null to use the default + */ + public String delegateGetPartName() { + return null; + } + + /** + * Returns the persistence category, as described in + * {@link AndroidXmlEditor#getPersistenceCategory}. + * + * @return the persistence category to use for this editor + */ + public int delegateGetPersistenceCategory() { + return AndroidXmlEditor.CATEGORY_OTHER; + } +} |