diff options
Diffstat (limited to 'src/plugins/android/src/com/motorola/studio/android/command/OpenStringEditor.java')
-rw-r--r-- | src/plugins/android/src/com/motorola/studio/android/command/OpenStringEditor.java | 292 |
1 files changed, 292 insertions, 0 deletions
diff --git a/src/plugins/android/src/com/motorola/studio/android/command/OpenStringEditor.java b/src/plugins/android/src/com/motorola/studio/android/command/OpenStringEditor.java new file mode 100644 index 0000000..a5e80ff --- /dev/null +++ b/src/plugins/android/src/com/motorola/studio/android/command/OpenStringEditor.java @@ -0,0 +1,292 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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.motorola.studio.android.command; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ILabelProviderListener; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.osgi.util.NLS; +import org.eclipse.sequoyah.localization.tools.datamodel.LocaleInfo; +import org.eclipse.sequoyah.localization.tools.extensions.classes.ILocalizationSchema; +import org.eclipse.sequoyah.localization.tools.managers.LocalizationManager; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.dialogs.ListDialog; +import org.eclipse.ui.handlers.HandlerUtil; +import org.eclipse.ui.ide.IDE.SharedImages; +import org.eclipse.ui.part.FileEditorInput; +import org.w3c.dom.Document; + +import com.motorola.studio.android.AndroidPlugin; +import com.motorola.studio.android.common.log.StudioLogger; +import com.motorola.studio.android.common.log.UsageDataConstants; +import com.motorola.studio.android.common.utilities.EclipseUtils; +import com.motorola.studio.android.i18n.AndroidNLS; + +/** + * Open the Android Localization Files Editor + */ +public class OpenStringEditor extends AbstractHandler +{ + public static String STRING_EDITOR_ID = + "org.eclipse.sequoyah.localization.tools.extensions.implementation.android.localizationEditor"; + + public Object execute(ExecutionEvent event) throws ExecutionException + { + + final List<IProject> supportedProjects = + LocalizationManager.getInstance().getSupportedProjects(); + + if (supportedProjects.size() == 0) + { + EclipseUtils.showErrorDialog(AndroidNLS.ERR_Localization_NoProjects_Title, + AndroidNLS.ERR_Localization_NoProjects_Description); + } + else + { + + Shell shell = HandlerUtil.getActiveShell(event); + + final ListDialog dialog = new ListDialog(shell); + + dialog.setContentProvider(new IStructuredContentProvider() + { + + public void dispose() + { + //do nothing + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) + { + //do nothing + } + + public Object[] getElements(Object inputElement) + { + return supportedProjects.toArray(new Object[supportedProjects.size()]); + } + }); + + dialog.setLabelProvider(new ILabelProvider() + { + + public void removeListener(ILabelProviderListener listener) + { + //do nothing + } + + public boolean isLabelProperty(Object element, String property) + { + return false; + } + + public void dispose() + { + //do nothing + } + + public void addListener(ILabelProviderListener listener) + { + //do nothing + } + + public String getText(Object element) + { + IProject project = (IProject) element; + return project.getName(); + } + + public Image getImage(Object element) + { + return PlatformUI.getWorkbench().getSharedImages() + .getImage(SharedImages.IMG_OBJ_PROJECT); + } + }); + + dialog.setInput(supportedProjects); + + dialog.setTitle(AndroidNLS.UI_Project_Selection); + dialog.create(); + dialog.getOkButton().setEnabled(false); + dialog.getTableViewer().addSelectionChangedListener(new ISelectionChangedListener() + { + + public void selectionChanged(SelectionChangedEvent event) + { + dialog.getOkButton().setEnabled(!event.getSelection().isEmpty()); + } + }); + dialog.open(); + Object[] result = dialog.getResult(); + + if ((result != null) && (result.length > 0)) + { + + IProject project = (IProject) result[0]; + try + { + ILocalizationSchema localizationSchema = + LocalizationManager.getInstance().getLocalizationSchema(project); + + if (localizationSchema != null) + { + Map<LocaleInfo, IFile> files = + localizationSchema.getLocalizationFiles(project); + if (files.size() > 0) + { + List<String> malformedXMLFiles = new ArrayList<String>(); + for (IFile file : files.values()) + { + try + { + //Before opening check if XML is valid + DocumentBuilderFactory factory = + DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(file.getContents()); + } + catch (Exception e) + { + malformedXMLFiles.add(file.getFullPath().toPortableString()); + } + } + if (malformedXMLFiles.isEmpty()) + { + //no malformed files - proceed opening editor + IFile inputFile = new ArrayList<IFile>(files.values()).get(0); + + final FileEditorInput fileEditor = new FileEditorInput(inputFile); + + final IWorkbenchWindow wbWindow = + PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + final IWorkbenchPage wbPage = wbWindow.getActivePage(); + + wbPage.openEditor(fileEditor, STRING_EDITOR_ID); + + //listen to project close event + ResourcesPlugin.getWorkspace().addResourceChangeListener( + new ProjectCloseListener(fileEditor, wbWindow, wbPage), + IResourceChangeEvent.PRE_CLOSE); + } + else + { + StudioLogger + .error("Cannot open Localization Files Editor - XML(s) Malformed: " + + malformedXMLFiles); + EclipseUtils + .showErrorDialog( + AndroidNLS.ERR_Localization_XMLMalformed_Title, + NLS.bind( + AndroidNLS.ERR_Localization_XMLMalformed_Description, + malformedXMLFiles.toString())); + } + } + else + { + EclipseUtils.showErrorDialog(AndroidNLS.ERR_Localization_NoFiles_Title, + AndroidNLS.ERR_Localization_NoFiles_Description); + } + + } + + // UDC log + StudioLogger.collectUsageData("Localization Editor openned", //$NON-NLS-1$ + "Localization Editor", UsageDataConstants.DESCRIPTION_DEFAULT, //$NON-NLS-1$ + AndroidPlugin.PLUGIN_ID, AndroidPlugin.getDefault().getBundle() + .getVersion().toString()); + } + catch (PartInitException e) + { + StudioLogger.error("Cannot open Localization Files Editor"); + } + } + } + + return null; + } + + /** + * This listener handles a project close event. It closes the location files editor + * associated with the project, in case it is still opened. + */ + private class ProjectCloseListener implements IResourceChangeListener + { + private FileEditorInput fileEditor; + + private IWorkbenchWindow wbWindow; + + private IWorkbenchPage wbPage; + + public ProjectCloseListener(FileEditorInput fileEditor, IWorkbenchWindow wbWindow, + IWorkbenchPage wbPage) + { + this.fileEditor = fileEditor; + this.wbWindow = wbWindow; + this.wbPage = wbPage; + } + + public void resourceChanged(IResourceChangeEvent event) + { + IProject closedProject = (IProject) event.getResource(); + + if (fileEditor.getFile().getProject().equals(closedProject)) + { + final IEditorPart part = wbPage.findEditor(fileEditor); + + //still opened + if (part != null) + { + //editor must be closed by a UI thread + wbWindow.getShell().getDisplay().syncExec(new Runnable() + { + public void run() + { + //saves the editor + wbPage.closeEditor(part, true); + } + }); + } + //removes listener from workspace + ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); + } + } + } +} |