/*
* ====================================================================
*
* The ObjectStyle Group Software License, Version 1.0
*
* Copyright (c) 2005 - 2006 The ObjectStyle Group and individual authors of the
* software. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: 1.
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer. 2. Redistributions in
* binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution. 3. The end-user documentation
* included with the redistribution, if any, must include the following
* acknowlegement: "This product includes software developed by the ObjectStyle
* Group (http://objectstyle.org/)." Alternately, this acknowlegement may
* appear in the software itself, if and wherever such third-party
* acknowlegements normally appear. 4. The names "ObjectStyle Group" and
* "Cayenne" must not be used to endorse or promote products derived from this
* software without prior written permission. For written permission, please
* contact andrus@objectstyle.org. 5. Products derived from this software may
* not be called "ObjectStyle" nor may "ObjectStyle" appear in their names
* without prior written permission of the ObjectStyle Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* OBJECTSTYLE GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many individuals
* on behalf of the ObjectStyle Group. For more information on the ObjectStyle
* Group, please see <http://objectstyle.org/> .
*
*/
package org.objectstyle.wolips.components.input;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.part.MultiEditorInput;
import org.objectstyle.wolips.components.ComponentsPlugin;
import org.objectstyle.wolips.editors.EditorsPlugin;
import org.objectstyle.wolips.locate.LocateException;
import org.objectstyle.wolips.locate.LocatePlugin;
import org.objectstyle.wolips.locate.result.LocalizedComponentsLocateResult;
public class ComponentEditorInput extends MultiEditorInput implements IPersistableElement {
private boolean displayHtmlPartOnReveal = true;
private boolean displayWodPartOnReveal = false;
private boolean displayApiPartOnReveal = false;
private boolean displayWooPartOnReveal = false;
private LocalizedComponentsLocateResult localizedComponentsLocateResult;
private IEditorInput[] componentEditors;
private IEditorInput apiEditor;
private IEditorInput standaloneHtmlEditor;
private String name;
public ComponentEditorInput(String name, String[] allEditorIDs, IEditorInput[] allInnerEditors, IEditorInput[] componentEditors, IEditorInput apiEditor, IEditorInput standaloneHtmlEditor) {
super(allEditorIDs, allInnerEditors);
this.name = name;
this.componentEditors = componentEditors;
this.apiEditor = apiEditor;
this.standaloneHtmlEditor = standaloneHtmlEditor;
}
private static ComponentEditorInput create(IFile originalFile, LocalizedComponentsLocateResult localizedComponentsLocateResult) throws CoreException {
List<IFolder> validFolders = new LinkedList<IFolder>();
for (IFolder folder : localizedComponentsLocateResult.getComponents()) {
// MS: SVN leaves an old folder around until you commit, but doesn't mark it as a phantom, so we
// can't know to remove it for any reason other than that it's empty ...
if (folder.members().length > 0) {
validFolders.add(folder);
}
}
IFolder[] folder = validFolders.toArray(new IFolder[validFolders.size()]);
int folderCountTimesThree = folder.length * 3;
String allIds[] = null;
ComponentEditorFileEditorInput allInput[] = null;
ComponentEditorFileEditorInput allComponentInput[] = null;
ComponentEditorFileEditorInput apiInput = null;
allIds = new String[folderCountTimesThree + 1];
allInput = new ComponentEditorFileEditorInput[folderCountTimesThree + 1];
allComponentInput = new ComponentEditorFileEditorInput[folderCountTimesThree];
int inputNum = 0;
IFile htmlFile = null;
IFile wodFile = null;
IFile wooFile = null;
for (int i = 0; i < folder.length; i++) {
IFolder currentFolder = folder[i];
htmlFile = LocalizedComponentsLocateResult.getHtml(currentFolder);
if (htmlFile == null) {
htmlFile = currentFolder.getFile(localizedComponentsLocateResult.getName() + ".html");
}
wodFile = LocalizedComponentsLocateResult.getWod(currentFolder);
if (wodFile == null) {
wodFile = currentFolder.getFile(localizedComponentsLocateResult.getName() + ".wod");
}
wooFile = LocalizedComponentsLocateResult.getWoo(currentFolder);
if (wooFile == null) {
wooFile = currentFolder.getFile(localizedComponentsLocateResult.getName() + ".woo");
}
allIds[inputNum] = EditorsPlugin.HTMLEditorID;
allInput[inputNum] = new ComponentEditorFileEditorInput(htmlFile);
allComponentInput[inputNum] = allInput[inputNum];
inputNum++;
allIds[inputNum] = EditorsPlugin.WodEditorID;
allInput[inputNum] = new ComponentEditorFileEditorInput(wodFile);
allComponentInput[inputNum] = allInput[inputNum];
inputNum++;
allIds[inputNum] = EditorsPlugin.WooEditorID;
allInput[inputNum] = new ComponentEditorFileEditorInput(wooFile);
allComponentInput[inputNum] = allInput[inputNum];
inputNum++;
}
String name = localizedComponentsLocateResult.getName();
if (localizedComponentsLocateResult.getDotApi() != null) {
allIds[inputNum] = EditorsPlugin.ApiEditorID;
allInput[inputNum] = new ComponentEditorFileEditorInput(localizedComponentsLocateResult.getDotApi());
apiInput = allInput[inputNum];
} else {
allIds[inputNum] = EditorsPlugin.ApiEditorID;
IFile referenceFile = wodFile;
if (referenceFile == null) {
referenceFile = htmlFile;
}
if (referenceFile != null) {
IFile api = wodFile.getParent().getParent().getFile(new Path(name + ".api"));
allInput[inputNum] = new ComponentEditorFileEditorInput(api);
apiInput = allInput[inputNum];
}
}
IEditorInput standaloneHtmlInput = null;
if (allComponentInput.length == 0 && apiInput == null && originalFile.getName().toLowerCase().endsWith(".html")) {
standaloneHtmlInput = new ComponentEditorFileEditorInput(originalFile);
name = originalFile.getName();
}
ComponentEditorInput input = new ComponentEditorInput(name, allIds, allInput, allComponentInput, apiInput, standaloneHtmlInput);
input.localizedComponentsLocateResult = localizedComponentsLocateResult;
for (int i = 0; i < allInput.length; i++) {
ComponentEditorFileEditorInput componentEditorFileEditorInput = allInput[i];
if(componentEditorFileEditorInput != null) {
componentEditorFileEditorInput.setComponentEditorInput(input);
}
}
return input;
}
public String getName() {
String inputName = this.name;
if (inputName == null) {
if (standaloneHtmlEditor != null) {
inputName = standaloneHtmlEditor.getName();
}
else {
inputName = "Unknown Component";
}
}
return inputName;
}
/*
* may return null
*/
private static ComponentEditorInput create(IFile file) throws CoreException {
LocalizedComponentsLocateResult localizedComponentsLocateResult = null;
try {
localizedComponentsLocateResult = LocatePlugin.getDefault().getLocalizedComponentsLocateResult(file);
} catch (CoreException e) {
ComponentsPlugin.getDefault().log(e);
return null;
} catch (LocateException e) {
ComponentsPlugin.getDefault().log(e);
return null;
}
// if (localizedComponentsLocateResult.getComponents() == null || localizedComponentsLocateResult.getComponents().length == 0) {
// return null;
// }
ComponentEditorInput input = create(file, localizedComponentsLocateResult);
return input;
}
/*
* may return null
*/
public static ComponentEditorInput createWithDotHtml(IFile file) throws CoreException {
ComponentEditorInput input = create(file);
if (input != null) {
input.displayHtmlPartOnReveal = true;
}
return input;
}
/*
* may return null
*/
public static ComponentEditorInput createWithDotWod(IFile file) throws CoreException {
ComponentEditorInput input = create(file);
if (input != null) {
input.displayWodPartOnReveal = true;
}
return input;
}
/*
* may return null
*/
public static ComponentEditorInput createWithDotApi(IFile file) throws CoreException {
ComponentEditorInput input = create(file);
if (input != null) {
input.displayApiPartOnReveal = true;
}
return input;
}
/*
* may return null
*/
public static ComponentEditorInput createWithDotWoo(IFile file) throws CoreException {
ComponentEditorInput input = create(file);
if (input != null) {
input.displayWooPartOnReveal = true;
}
return input;
}
/**
* Returns the language name for the given component file editor input
* or null if it's not in an lproj folder.
*
* @param editorInput the editor input to lookup the language for
* @return the language name (or null)
*/
public static String getLanguageName(IFileEditorInput editorInput) {
String language = null;
if (editorInput != null) {
IFile file = editorInput.getFile();
language = ComponentEditorInput.getLanguageName(file);
}
return language;
}
/**
* Returns the language name for the given component file
* or null if it's not in an lproj folder.
*
* @param file the file to lookup the language for
* @return the language name (or null)
*/
public static String getLanguageName(IFile file) {
String language = null;
if (file != null && file.exists()) {
IResource resource = file;
boolean done = false;
do {
resource = resource.getParent();
if (resource == null) {
done = true;
}
else {
String name = resource.getName();
if (name.endsWith(".lproj")) {
language = name.substring(0, name.lastIndexOf('.'));
done = true;
}
}
} while (!done);
}
return language;
}
public LocalizedComponentsLocateResult getLocalizedComponentsLocateResult() {
return localizedComponentsLocateResult;
}
public String getFactoryId() {
return ComponentEditorInputFactory.ID_FACTORY;
}
public void saveState(IMemento memento) {
ComponentEditorInputFactory.saveState(memento, this);
}
public IPersistableElement getPersistable() {
return this;
}
public boolean isDisplayApiPartOnReveal() {
return displayApiPartOnReveal;
}
public void setDisplayApiPartOnReveal(boolean displayApiPartOnReveal) {
this.displayApiPartOnReveal = displayApiPartOnReveal;
}
public boolean isDisplayHtmlPartOnReveal() {
return displayHtmlPartOnReveal;
}
public void setDisplayHtmlPartOnReveal(boolean displayHtmlPartOnReveal) {
this.displayHtmlPartOnReveal = displayHtmlPartOnReveal;
}
public boolean isDisplayWodPartOnReveal() {
return displayWodPartOnReveal;
}
public void setDisplayWodPartOnReveal(boolean displayWodPartOnReveal) {
this.displayWodPartOnReveal = displayWodPartOnReveal;
}
public boolean isDisplayWooPartOnReveal() {
return displayWooPartOnReveal;
}
public void setDisplayWooPartOnReveal(boolean displayWooPartOnReveal) {
this.displayWooPartOnReveal = displayWooPartOnReveal;
}
public IEditorInput getApiEditor() {
return apiEditor;
}
public IEditorInput getStandaloneHtmlEditor() {
return standaloneHtmlEditor;
}
public IEditorInput[] getComponentEditors() {
return componentEditors;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
int hash = 0;
String[] editors = getEditors();
for (int i = 0; i < editors.length; i++) {
if (editors[i] != null) {
hash = hash * 37 + editors[i].hashCode();
}
}
IEditorInput[] input = getInput();
for (int i = 0; i < input.length; i++) {
if (input[i] != null) {
hash = hash * 37 + input[i].hashCode();
}
}
return hash;
}
}