diff options
author | Dani Megert | 2006-09-08 07:42:49 +0000 |
---|---|---|
committer | Dani Megert | 2006-09-08 07:42:49 +0000 |
commit | 7a10572ac18c55f56802eba2c30157f296f92ff2 (patch) | |
tree | e416357c5ed1c06ea1a2a85d7d30bc502d636632 /org.eclipse.ui.editors/src/org/eclipse/ui | |
parent | 879ba61e00a094377187a103323a8e4899d55922 (diff) | |
download | eclipse.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')
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} |