summaryrefslogtreecommitdiff
path: root/src/plugins/android/src/com/motorola/studio/android/command/OpenStringEditor.java
diff options
context:
space:
mode:
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.java292
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);
+ }
+ }
+ }
+}