/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.filesystems.impl;
import java.io.File;
import java.io.IOException;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.swt.widgets.Display;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.impl.*;
import org.jboss.tools.common.meta.action.*;
import org.jboss.tools.common.meta.constraint.XProperty;
import org.jboss.tools.common.model.XJob.XRunnable;
import org.jboss.tools.common.model.filesystems.*;
public class FileAnyImpl extends RegularObjectImpl implements XModelObjectConstants {
/**
* This is text editor that reads text from file than
* from model object. If some action modifies text
* by getModel().editObjectAttribute() method, text
* editor must be notified.
*/
public interface BodyListener {
public void bodyChanged(String body);
}
private static final long serialVersionUID = 5613864065417244573L;
private BodySource bodysource = null;
BodyListener listener;
/**
* Used only for temporarily loaded objects that are to be merged into existing object.
* If this property is set, get(name) for body attributes are redirected to it,
* and set(name, value) for body attributes are ignored.
*/
private BodySource body = null;
private String tempBody = "";
int updateLock = 0;
public void setUpdateLock() {
updateLock++;
}
public void releaseUpdateLock() {
updateLock--;
}
public FileAnyImpl() {}
public void addListener(BodyListener listener) {
this.listener = listener;
}
public void removeListener(BodyListener listener) {
if(this.listener == listener) this.listener = null;
}
public void setModified(boolean value) {
boolean changed = (isModified() != value);
if(changed && value) {
//The layout of process files will not be saved!
XModelObject p = getParent();
if(p instanceof JarFolderImpl) return;
}
super.setModified(value);
if(changed && isActive() && updateLock <= 0) {
fireObjectChanged("setModified"); //$NON-NLS-1$
if(value) {
saveUnopen();
}
}
}
public boolean isObjectEditable() {
return isObjectEditable0();
}
private boolean isObjectEditable0() {
if(TRUE.equals(get("overlapped")) && isActive()) return false; //$NON-NLS-1$
XModelObject p = getParent();
if(p == null) return true;
if(p instanceof JarFolderImpl) return false;
if(p instanceof FolderImpl) return ((FolderImpl)p).isChildEditable(this);
return true;
}
public boolean isAttributeEditable(String name) {
if(ATTR_NAME.equals(name) || ATTR_NAME_EXTENSION.equals(name)) return false;
if(ATTR_NAME_BODY.equals(name)) {
return isObjectEditable0();
}
return super.isAttributeEditable(name);
}
public String getMainIconName() {
if(TRUE.equals(get("overlapped")) && isActive()) { //$NON-NLS-1$
String oin = get("overlappedSystem"); //$NON-NLS-1$
XModelObject o = (oin == null || oin.length() == 0) ? null : getModel().getByPath(oin);
if(o == null) {
o = this;
while(o != null && o.getFileType() != XFileObject.SYSTEM) o = o.getParent();
}
if(o != null) return o.getMainIconName();
}
return super.getMainIconName();
}
public String name() {
return toFileName(this);
}
public int getFileType() {
return FILE;
}
public String getPathPart() {
String n = name();
String pp = FilePathHelper.toPathPath(n);
return (n == null) ? null : pp;
}
public static String toFileName(XProperty p) {
String n = p.get(XML_ATTR_NAME);
if(n == null) return null;
String s = p.get("EXTENSION"); //$NON-NLS-1$
return n + ((s == null || s.length() == 0) ? "" : "." + s); //$NON-NLS-1$ //$NON-NLS-2$
}
public void setBodySource(BodySource bodysource) {
this.bodysource = bodysource;
if(bodysource instanceof SFBodySource) {
body = bodysource;
}
super.set(ATTR_NAME_BODY, ""); //$NON-NLS-1$
changeTimeStamp();
}
public void updateBodySource() {
XModelObject o = getParent();
if(!(o instanceof FolderLoader)) return;
FolderLoader f = (FolderLoader)o;
bodysource = f.getBodySource(toFileName(this));
}
public BodySource getBodySource() {
return bodysource;
}
public String get(String name) {
if(body != null) {
if(ATTR_NAME_BODY.equals(name)) {
bodysource = null;
}
if(ATTR_NAME_BODY.equals(name)
|| ATTR_NAME__BODY_.equals(name)
|| ATTR_NAME_CORRECT_BODY.equals(name)
|| ATTR_NAME_INCORRECT_BODY.equals(name)
) {
return body.get();
}
} else if(ATTR_NAME__BODY_.equals(name)) {
return tempBody;
}
if(bodysource != null && ATTR_NAME_BODY.equals(name)) readBodySource();
return super.get(name);
}
private void readBodySource() {
String s = bodysource.get();
bodysource = null;
if(s != null) super.set(ATTR_NAME_BODY, s);
}
public String setAttributeValue(String name, String value) {
// if(ATTR_NAME_EXTENSION.equals(name) && isActive()) {
// if(!value.equals(getAttributeValue(ATTR_NAME_EXTENSION))) {
// if(new ExtensionChange().execute(this, value) && getParent() == null) {
// return getAttributeValue(name);
// }
// }
// }
return super.setAttributeValue(name, value);
}
public String getAsText() {
if(body != null) {
return body.get();
}
return getAttributeValue(ATTR_NAME_BODY);
}
public void edit(String body) throws XModelException {
getModel().changeObjectAttribute(this, ATTR_NAME_BODY, body);
}
public void set(String name, String value) {
if(body != null) {
if(ATTR_NAME_BODY.equals(name)
|| ATTR_NAME__BODY_.equals(name)
|| ATTR_NAME_CORRECT_BODY.equals(name)
|| ATTR_NAME_INCORRECT_BODY.equals(name)
) {
//do nothing
return;
}
}
if(ATTR_NAME__BODY_.equals(name)) {
tempBody = value;
} else if((!XML_ATTR_NAME.equals(name) && !"EXTENSION".equals(name)) || !isActive() || !(getParent() instanceof FolderImpl)) { //$NON-NLS-1$
super.set(name, value);
} else {
rename0(value, name);
}
}
public void fileRenamed(String name, String extension) {
if(name != null && name.equals(super.get(XML_ATTR_NAME))
&& extension != null && extension.equals(super.get("EXTENSION"))) { //$NON-NLS-1$
return;
}
super.set(XML_ATTR_NAME, name);
super.set("EXTENSION", extension); //$NON-NLS-1$
safeChangeTimeStamp();
fireObjectChanged(null);
}
void rename0(String value, String attr) {
FolderImpl p = (FolderImpl)getParent();
IFile f = p.getChildFile(toFileName(this));
String n1 = get(attr);
super.set(attr, value);
String n2 = get(attr);
IFile f2 = p.getChildFile(toFileName(this));
if(f2.exists() && !f.exists()) return;
if(!n2.equals(n1)) {
try {
f.move(new Path(f.getParent().getFullPath() + SEPARATOR + toFileName(this)), true, null);
} catch (OperationCanceledException e) {
super.set(attr, n1);
} catch (CoreException e) {
super.set(attr, n1);
}
}
}
public String getAbsolutePath() {
if(!(getParent() instanceof FolderImpl)) return null;
FolderImpl p = (FolderImpl)getParent();
File f = p.getFile();
if(f == null) return null;
f = new File(f, toFileName(this));
if(f.isFile()) {
try {
return f.getCanonicalPath().replace('\\', '/');
} catch (IOException e) {
//ignore - if file does not exist, do replacements in other way
}
}
return f.getAbsolutePath().replace('\\', '/');
}
public IFile getFile() {
if(!(getParent() instanceof FolderImpl)) return null;
return ((FolderImpl)getParent()).getChildFile(toFileName(this));
}
public Object getAdapter(Class adapter) {
if(IResource.class == adapter || IFile.class == adapter) return getFile();
return super.getAdapter(adapter);
}
private void saveUnopen() {
if(!isModified() || !isActive()) return;
XJob.addRunnableWithPriority(new XRunnable() {
public String getId() {
return "Save " + getPath(); //$NON-NLS-1$
}
public void run() {
Display.getDefault().asyncExec(new Runnable(){
public void run() {
saveUnopen0();
}
});
}
});
}
private void saveUnopen0() {
if(!isActive()) return;
//Be careful!
if(!isModified()) return;
SpecialWizard w = SpecialWizardFactory.createSpecialWizard("org.jboss.tools.common.model.ui.objecteditor.SaveUnopenSpecialWizard"); //$NON-NLS-1$
if(w == null) return;
w.setObject(this);
w.execute();
}
protected void onAttributeValueEdit(String name, String oldValue, String newValue) throws XModelException {
if(ATTR_NAME_BODY.equals(name) && listener != null) {
listener.bodyChanged(newValue);
}
}
}