blob: 7f3db607312d321a3b2b77ddfeb500cd1ba98de8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.ui.model;
import java.io.*;
import java.util.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.text.*;
import org.eclipse.pde.core.*;
import org.eclipse.pde.internal.core.*;
public abstract class AbstractEditingModel extends PlatformObject implements IEditingModel, IModelChangeProviderExtension {
private ArrayList fListeners = new ArrayList();
protected boolean fReconciling;
protected boolean fInSync = true;
protected boolean fLoaded = false;
protected boolean fDisposed;
protected long fTimestamp;
private transient NLResourceHelper fNLResourceHelper;
private IDocument fDocument;
private boolean fDirty;
private String fCharset;
private IResource fUnderlyingResource;
private String fInstallLocation;
private boolean fStale;
public AbstractEditingModel(IDocument document, boolean isReconciling) {
fDocument = document;
fReconciling = isReconciling;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#dispose()
*/
public void dispose() {
if (fNLResourceHelper != null) {
fNLResourceHelper.dispose();
fNLResourceHelper = null;
}
fDisposed = true;
fListeners.clear();
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#getResourceString(java.lang.String)
*/
public String getResourceString(String key) {
if (key == null || key.length() == 0)
return ""; //$NON-NLS-1$
if (fNLResourceHelper == null)
fNLResourceHelper = createNLResourceHelper();
return (fNLResourceHelper == null) ? key : fNLResourceHelper.getResourceString(key);
}
protected abstract NLResourceHelper createNLResourceHelper();
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isDisposed()
*/
public boolean isDisposed() {
return fDisposed;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isEditable()
*/
public boolean isEditable() {
return fReconciling;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isLoaded()
*/
public boolean isLoaded() {
return fLoaded;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isInSync()
*/
public boolean isInSync() {
return fInSync;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isValid()
*/
public boolean isValid() {
return isLoaded();
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#getTimeStamp()
*/
public final long getTimeStamp() {
return fTimestamp;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#load()
*/
public final void load() throws CoreException {
try {
load(getInputStream(getDocument()), false);
} catch (UnsupportedEncodingException e) {
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#reload(java.io.InputStream, boolean)
*/
public final void reload(InputStream source, boolean outOfSync)
throws CoreException {
load(source, outOfSync);
fireModelChanged(
new ModelChangedEvent(this,
IModelChangedEvent.WORLD_CHANGED,
new Object[] {this},
null));
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isReconcilingModel()
*/
public boolean isReconcilingModel() {
return fReconciling;
}
public IDocument getDocument() {
return fDocument;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.neweditor.text.IReconcilingParticipant#reconciled(org.eclipse.jface.text.IDocument)
*/
public final void reconciled(IDocument document) {
if (isReconcilingModel()) {
try {
if (isStale()) {
adjustOffsets(document);
setStale(false);
} else {
reload(getInputStream(document), false);
}
if (isDirty())
setDirty(false);
} catch (Exception e) {
}
}
}
protected abstract void adjustOffsets(IDocument document);
protected InputStream getInputStream(IDocument document) throws UnsupportedEncodingException {
return new ByteArrayInputStream(document.get().getBytes(getCharset()));
}
public String getCharset() {
return fCharset != null ? fCharset : "UTF-8"; //$NON-NLS-1$
}
public void setCharset(String charset) {
fCharset = charset;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModelChangeProvider#addModelChangedListener(org.eclipse.pde.core.IModelChangedListener)
*/
public void addModelChangedListener(IModelChangedListener listener) {
if (!fListeners.contains(listener))
fListeners.add(listener);
}
public void transferListenersTo(IModelChangeProviderExtension target, IModelChangedListenerFilter filter) {
List oldList = (List)fListeners.clone();
for (int i=0; i<oldList.size(); i++) {
IModelChangedListener listener = (IModelChangedListener)oldList.get(i);
if (filter==null || filter.accept(listener)) {
// add the listener to the target
target.addModelChangedListener(listener);
// remove the listener from our list
fListeners.remove(listener);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModelChangeProvider#fireModelChanged(org.eclipse.pde.core.IModelChangedEvent)
*/
public void fireModelChanged(IModelChangedEvent event) {
setDirty(event.getChangeType() != IModelChangedEvent.WORLD_CHANGED);
for (int i = 0; i < fListeners.size(); i++) {
((IModelChangedListener)fListeners.get(i)).modelChanged(event);
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModelChangeProvider#fireModelObjectChanged(java.lang.Object, java.lang.String, java.lang.Object, java.lang.Object)
*/
public void fireModelObjectChanged(Object object, String property, Object oldValue, Object newValue) {
fireModelChanged(new ModelChangedEvent(this, object, property, oldValue, newValue));
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModelChangeProvider#removeModelChangedListener(org.eclipse.pde.core.IModelChangedListener)
*/
public void removeModelChangedListener(IModelChangedListener listener) {
fListeners.remove(listener);
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IEditable#isDirty()
*/
public boolean isDirty() {
return fDirty;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IEditable#save(java.io.PrintWriter)
*/
public void save(PrintWriter writer) {
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IEditable#setDirty(boolean)
*/
public void setDirty(boolean dirty) {
this.fDirty = dirty;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.model.IEditingModel#isStale()
*/
public boolean isStale() {
return fStale;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.model.IEditingModel#setStale(boolean)
*/
public void setStale(boolean stale) {
fStale = stale;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#getUnderlyingResource()
*/
public IResource getUnderlyingResource() {
return fUnderlyingResource;
}
public void setUnderlyingResource(IResource resource) {
fUnderlyingResource = resource;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.plugin.ISharedPluginModel#getInstallLocation()
*/
public String getInstallLocation() {
if (fUnderlyingResource != null)
return fUnderlyingResource.getProject().getLocation().addTrailingSeparator().toString();
return fInstallLocation;
}
public void setInstallLocation(String location) {
fInstallLocation = location;
}
}