blob: d9ee8a5d8b99c41afcb7cc2cd422906a2c2e18b1 [file] [log] [blame]
/*
* 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;
}
}