Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDani Megert2006-09-08 07:42:49 +0000
committerDani Megert2006-09-08 07:42:49 +0000
commit7a10572ac18c55f56802eba2c30157f296f92ff2 (patch)
treee416357c5ed1c06ea1a2a85d7d30bc502d636632 /org.eclipse.ui.editors/src/org/eclipse/ui
parent879ba61e00a094377187a103323a8e4899d55922 (diff)
downloadeclipse.platform.text-7a10572ac18c55f56802eba2c30157f296f92ff2.tar.gz
eclipse.platform.text-7a10572ac18c55f56802eba2c30157f296f92ff2.tar.xz
eclipse.platform.text-7a10572ac18c55f56802eba2c30157f296f92ff2.zip
Fixed bug 148931: [misc] warn when editing a derived file
Diffstat (limited to 'org.eclipse.ui.editors/src/org/eclipse/ui')
-rw-r--r--org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/EditorsUI.java33
-rw-r--r--org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/FileDocumentProvider.java24
-rw-r--r--org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorMessages.java2
-rw-r--r--org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorMessages.properties2
-rw-r--r--org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java5
-rw-r--r--org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.java1
-rw-r--r--org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.properties1
-rw-r--r--org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java67
-rw-r--r--org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java16
-rw-r--r--org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.java3
-rw-r--r--org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.properties5
11 files changed, 158 insertions, 1 deletions
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/EditorsUI.java b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/EditorsUI.java
index 4fb28ab0a37..44312c8bbeb 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/EditorsUI.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/EditorsUI.java
@@ -14,6 +14,11 @@ import java.nio.charset.UnmappableCharacterException;
import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.resources.IResource;
+
+import org.eclipse.core.filebuffers.IFileBuffer;
+import org.eclipse.core.filebuffers.IFileBufferStatusCodes;
+
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.source.ISharedTextColors;
@@ -179,5 +184,33 @@ public final class EditorsUI {
* @since 3.2
*/
public static final int CHARSET_MAPPING_FAILED= 1;
+
+ /**
+ * Editor UI plug-in status code indicating that state
+ * validation failed.
+ * <p>
+ * Value: {@value}</p>
+ * <p>
+ * NOTE: This API is fresh and may change before the final API freeze.
+ * </p>
+ *
+ * @see IFileBuffer#validateState(org.eclipse.core.runtime.IProgressMonitor, Object)
+ * @since 3.3
+ */
+ public static final int STATE_VALIDATION_FAILED= IFileBufferStatusCodes.STATE_VALIDATION_FAILED;
+
+ /**
+ * Editor UI plug-in status code indicating that
+ * a resource is marked derived.
+ * <p>
+ * Value: {@value}</p>
+ * <p>
+ * NOTE: This API is fresh and may change before the final API freeze.
+ * </p>
+ *
+ * @see IResource#isDerived()
+ * @since 3.3
+ */
+ public static final int DERIVED_FILE= IFileBufferStatusCodes.DERIVED_FILE;
}
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/FileDocumentProvider.java b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/FileDocumentProvider.java
index a568ad87b91..4d9e328309b 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/FileDocumentProvider.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/FileDocumentProvider.java
@@ -32,6 +32,7 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.QualifiedName;
@@ -891,13 +892,34 @@ public class FileDocumentProvider extends StorageDocumentProvider {
IFile file= input.getFile();
if (file.isReadOnly()) { // do not use cached state here
IWorkspace workspace= file.getWorkspace();
- workspace.validateEdit(new IFile[] { file }, computationContext);
+ info.fStatus= workspace.validateEdit(new IFile[] { file }, computationContext);
+ }
+ if (isDerived(file)) {
+ IStatus status= new Status(IStatus.WARNING, EditorsUI.PLUGIN_ID, EditorsUI.DERIVED_FILE, TextEditorMessages.FileDocumentProvider_warning_fileIsDerived, null);
+ if (info.fStatus == null || info.fStatus.isOK())
+ info.fStatus= status;
+ else
+ info.fStatus= new MultiStatus(EditorsUI.PLUGIN_ID, EditorsUI.STATE_VALIDATION_FAILED, new IStatus[] {info.fStatus, status}, TextEditorMessages.FileDocumentProvider_stateValidationFailed, null);
}
}
}
super.doValidateState(element, computationContext);
}
+
+ /*
+ *
+ * @see IResource#isDerived()
+ * @since 3.3
+ */
+ private boolean isDerived(IResource resource) {
+ while (resource != null) {
+ if (resource.isDerived())
+ return true;
+ resource= resource.getParent();
+ }
+ return false;
+ }
/*
* @see IDocumentProviderExtension#isModifiable(Object)
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorMessages.java b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorMessages.java
index 6ce78e0f0f7..00d02ce3944 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorMessages.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorMessages.java
@@ -45,6 +45,8 @@ final class TextEditorMessages extends NLS {
public static String FileDocumentProvider_task_saving;
public static String FileDocumentProvider_resetDocument;
public static String FileDocumentProvider_getPersistedEncoding;
+ public static String FileDocumentProvider_warning_fileIsDerived;
+ public static String FileDocumentProvider_stateValidationFailed;
public static String DocumentProvider_error_charset_mapping_failed_message_arg;
public static String DocumentProvider_error_illegal_encoding_message_arg;
public static String DocumentProvider_error_unsupported_encoding_message_arg;
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorMessages.properties b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorMessages.properties
index f62b3243dc0..3f36d518d09 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorMessages.properties
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextEditorMessages.properties
@@ -17,6 +17,8 @@ FileDocumentProvider_error_out_of_sync=Has been changed on the file system
FileDocumentProvider_task_saving=Saving
FileDocumentProvider_resetDocument=FileDocumentProvider.resetDocument
FileDocumentProvider_getPersistedEncoding=Cannot migrate encoding property
+FileDocumentProvider_warning_fileIsDerived= This file is derived and does not allow to be modified.
+FileDocumentProvider_stateValidationFailed= State validation failed.
DocumentProvider_error_illegal_encoding_message_arg= Character encoding "{0}" is not a legal character encoding.
DocumentProvider_error_unsupported_encoding_message_arg= Character encoding "{0}" is not supported by this platform.
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java
index c3fa9ec1022..3754d3a32a5 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java
@@ -450,6 +450,7 @@ public class TextEditorDefaultsPreferencePage extends PreferencePage implements
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_KEY_MODIFIER_MASK));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.SHOW_RANGE_INDICATOR));
+ overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_WARN_IF_INPUT_DERIVED));
OverlayPreferenceStore.OverlayKey[] keys= new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
overlayKeys.toArray(keys);
@@ -532,6 +533,10 @@ public class TextEditorDefaultsPreferencePage extends PreferencePage implements
Preference showMagnet= new Preference(AbstractDecoratedTextEditorPreferenceConstants.SHOW_RANGE_INDICATOR, label, null);
addCheckBox(appearanceComposite, showMagnet, new BooleanDomain(), 0);
+ label= TextEditorMessages.TextEditorDefaultsPreferencePage_warn_if_derived;
+ Preference warnIfDerived= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_WARN_IF_INPUT_DERIVED, label, null);
+ addCheckBox(appearanceComposite, warnIfDerived, new BooleanDomain(), 0);
+
label= TextEditorMessages.HyperlinksEnabled_label;
Preference hyperlinksEnabled= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINKS_ENABLED, label, null);
fHyperlinksEnabledCheckBox= addCheckBox(appearanceComposite, hyperlinksEnabled, new BooleanDomain(), 0);
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.java b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.java
index 79604bd0331..ee04e77e5da 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.java
@@ -116,6 +116,7 @@ final class TextEditorMessages extends NLS {
}
public static String TextEditorDefaultsPreferencePage_range_indicator;
+ public static String TextEditorDefaultsPreferencePage_warn_if_derived;
public static String LinkedModeConfigurationBlock_annotationPresentationOptions;
public static String LinkedModeConfigurationBlock_SQUIGGLES;
public static String LinkedModeConfigurationBlock_UNDERLINE;
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.properties b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.properties
index b37993413b1..0557c5d853d 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.properties
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.properties
@@ -28,6 +28,7 @@ TextEditorPreferencePage_findScopeColor=Find scope
TextEditorPreferencePage_accessibility_disableCustomCarets= Use &custom caret
TextEditorPreferencePage_accessibility_wideCaret= &Enable thick caret
TextEditorDefaultsPreferencePage_range_indicator=Show &range indicator
+TextEditorDefaultsPreferencePage_warn_if_derived= War&n before editing a derived file
TextEditorPreferencePage_colorsAndFonts_link= More colors can be configured on the <a>Colors and Fonts</a> preference page.
TextEditorPreferencePage_colorsAndFonts_link_tooltip= Show the Colors and Fonts preferences
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java
index a5217cf5182..da7efd2748d 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java
@@ -47,6 +47,9 @@ import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.filebuffers.FileBuffers;
+import org.eclipse.core.filebuffers.IFileBufferStatusCodes;
+
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IAction;
@@ -56,6 +59,7 @@ import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
@@ -241,6 +245,11 @@ public abstract class AbstractDecoratedTextEditor extends StatusTextEditor {
*/
protected boolean fIsUpdatingMarkerViews= false;
/**
+ * Tells whether editing the current derived editor input is allowed.
+ * @since 3.3
+ */
+ private boolean fIsEditingDerivedFileAllowed= true;
+ /**
* The delegating annotation ruler contribution.
* @since 3.3
*/
@@ -872,6 +881,63 @@ public abstract class AbstractDecoratedTextEditor extends StatusTextEditor {
if (end - 1 < length && start < length)
selectAndReveal(start, end - start);
}
+
+ /*
+ * @see org.eclipse.ui.texteditor.AbstractTextEditor#isEditable()
+ * @since 3.3
+ */
+ public boolean isEditable() {
+ if (!super.isEditable())
+ return false;
+ return fIsEditingDerivedFileAllowed;
+ }
+
+ /*
+ * @see org.eclipse.ui.texteditor.StatusTextEditor#validateEditorInputState()
+ * @since 3.3
+ */
+ public boolean validateEditorInputState() {
+ if (!super.validateEditorInputState())
+ return false;
+
+ return validateEditorInputDerived();
+ }
+
+ /**
+ * Validates the editor input for derived state.
+ * If the given input is derived then this method
+ * can show a dialog asking whether to edit the
+ * derived file.
+ *
+ * @return <code>true</code> if the input is OK for editing, <code>false</code> otherwise
+ * @since 3.3
+ */
+ private boolean validateEditorInputDerived() {
+ if (getDocumentProvider() instanceof IDocumentProviderExtension) {
+ IDocumentProviderExtension extension= (IDocumentProviderExtension)getDocumentProvider();
+ IStatus status= extension.getStatus(getEditorInput());
+ String pluginId= status.getPlugin();
+ if (status.getCode() != IFileBufferStatusCodes.DERIVED_FILE || (FileBuffers.PLUGIN_ID.equals(pluginId) && EditorsUI.PLUGIN_ID.equals(pluginId)))
+ return true;
+ }
+
+ final String warnKey= AbstractDecoratedTextEditorPreferenceConstants.EDITOR_WARN_IF_INPUT_DERIVED;
+ IPreferenceStore store= getPreferenceStore();
+ if (!store.getBoolean(warnKey))
+ return true;
+
+ MessageDialogWithToggle toggleDialog= MessageDialogWithToggle.openYesNoQuestion(
+ getSite().getShell(),
+ TextEditorMessages.AbstractDecoratedTextEditor_warning_derived_title,
+ TextEditorMessages.AbstractDecoratedTextEditor_warning_derived_message,
+ TextEditorMessages.AbstractDecoratedTextEditor_warning_derived_dontShowAgain,
+ false,
+ null,
+ null);
+
+ store.setValue(warnKey, !toggleDialog.getToggleState());
+ return fIsEditingDerivedFileAllowed= toggleDialog.getReturnCode() == IDialogConstants.YES_ID;
+ }
/*
* For an explanation why we override this method see:
@@ -1103,6 +1169,7 @@ public abstract class AbstractDecoratedTextEditor extends StatusTextEditor {
* ruler.
*/
protected void doSetInput(IEditorInput input) throws CoreException {
+ fIsEditingDerivedFileAllowed= true;
if (fLineColumn != null)
fLineColumn.hideRevisionInformation();
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java
index 2a2998614c1..abdea1662d0 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java
@@ -333,6 +333,20 @@ public class AbstractDecoratedTextEditorPreferenceConstants {
* @since 3.1
*/
public static final String EDITOR_DISABLE_OVERWRITE_MODE= "disable_overwrite_mode"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls whether a confirmation
+ * dialog is shown before editing derived input.
+ * <p>
+ * Value is of type <code>Boolean</code>.
+ * </p>
+ * <p>
+ * NOTE: This API is fresh and may change before the final API freeze.
+ * </p>
+ *
+ * @since 3.3
+ */
+ public static final String EDITOR_WARN_IF_INPUT_DERIVED= "warn_if_input_derived"; //$NON-NLS-1$
/**
* A named preference that controls the display of the range indicator.
@@ -475,6 +489,8 @@ public class AbstractDecoratedTextEditorPreferenceConstants {
store.setDefault(REVISION_RULER_SHOW_AUTHOR, false);
store.setDefault(REVISION_RULER_SHOW_REVISION, false);
+ store.setDefault(EDITOR_WARN_IF_INPUT_DERIVED, true);
+
MarkerAnnotationPreferences.initializeDefaultValues(store);
}
}
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.java b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.java
index df966b9ee53..700268c5a4c 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.java
@@ -62,6 +62,9 @@ final class TextEditorMessages extends NLS {
public static String AbstractDecoratedTextEditor_error_saveAs_message;
public static String AbstractDecoratedTextEditor_saveAs_overwrite_title;
public static String AbstractDecoratedTextEditor_saveAs_overwrite_message;
+ public static String AbstractDecoratedTextEditor_warning_derived_title;
+ public static String AbstractDecoratedTextEditor_warning_derived_message;
+ public static String AbstractDecoratedTextEditor_warning_derived_dontShowAgain;
public static String AbstractDecoratedTextEditor_showIn_menu;
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.properties b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.properties
index 1c74002ac8c..2f06246c622 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.properties
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.properties
@@ -34,6 +34,11 @@ AbstractDecoratedTextEditor_saveAs_overwrite_title=Save As
AbstractDecoratedTextEditor_saveAs_overwrite_message={0} already exists.\nDo you want to replace it?
AbstractDecoratedTextEditor_warning_saveAs_deleted=The original file ''{0}'' has been deleted or is not accessible.
AbstractDecoratedTextEditor_revisions_menu=Re&visions
+AbstractDecoratedTextEditor_warning_saveAs_deleted=The original file ''{0}'' has been deleted or is not accessible.
+AbstractDecoratedTextEditor_warning_derived_title= Derived File Encountered
+AbstractDecoratedTextEditor_warning_derived_message= This file is derived. Do you really want to edit it?
+AbstractDecoratedTextEditor_warning_derived_dontShowAgain= Do not show this message again.
+
# {0} will be replaced by the key binding
AbstractDecoratedTextEditor_showIn_menu= Sho&w In\t{0}

Back to the top