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