Copyright (c) 2005 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation
/******************************************************************************* * Copyright (c) 2005 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
package org.eclipse.core.internal.content; import java.util.List; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.content.IContentDescription; import org.eclipse.core.runtime.content.IContentTypeSettings; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.osgi.util.NLS; import org.osgi.service.prefs.BackingStoreException; import org.osgi.service.prefs.Preferences; public class ContentTypeSettings implements IContentTypeSettings, IContentTypeInfo { private ContentType contentType; private IScopeContext context; static void addFileSpec(IScopeContext context, String contentTypeId, String fileSpec, int type) throws CoreException { Preferences contentTypeNode = ContentTypeManager.getInstance().getPreferences(context).node(contentTypeId); String key = ContentType.getPreferenceKey(type); List<String> existingValues = Util.parseItemsIntoList(contentTypeNode.get(key, null)); for (int i = 0; i < existingValues.size(); i++) if (existingValues.get(i).equalsIgnoreCase(fileSpec)) // don't do anything if already exists return; existingValues.add(fileSpec); // set new preference value String newValue = Util.toListString(existingValues.toArray()); ContentType.setPreference(contentTypeNode, key, newValue); try { contentTypeNode.flush(); } catch (BackingStoreException bse) { String message = NLS.bind(ContentMessages.content_errorSavingSettings, contentTypeId); IStatus status = new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, bse); throw new CoreException(status); } } static String[] getFileSpecs(IScopeContext context, String contentTypeId, int type) { Preferences contentTypeNode = ContentTypeManager.getInstance().getPreferences(context).node(contentTypeId); return getFileSpecs(contentTypeNode, type); } static String[] getFileSpecs(Preferences contentTypeNode, int type) { String key = ContentType.getPreferenceKey(type); String existing = contentTypeNode.get(key, null); return Util.parseItems(existing); } public static String internalGetDefaultProperty(ContentType current, final Preferences contentTypePrefs, final QualifiedName key) throws BackingStoreException { String id = current.getId(); if (contentTypePrefs.nodeExists(id)) { Preferences contentTypeNode = contentTypePrefs.node(id); String propertyValue = contentTypeNode.get(key.getLocalName(), null); if (propertyValue != null) return propertyValue; } // try built-in settings String propertyValue = current.basicGetDefaultProperty(key); if (propertyValue != null) return propertyValue; // try ancestor ContentType baseType = (ContentType) current.getBaseType(); return baseType == null ? null : internalGetDefaultProperty(baseType, contentTypePrefs, key); } static void removeFileSpec(IScopeContext context, String contentTypeId, String fileSpec, int type) throws CoreException { Preferences contentTypeNode = ContentTypeManager.getInstance().getPreferences(context).node(contentTypeId); String key = ContentType.getPreferenceKey(type); String existing = contentTypeNode.get(key, null); if (existing == null) // content type has no settings - nothing to do return; List<String> existingValues = Util.parseItemsIntoList(contentTypeNode.get(key, null)); int index = -1; int existingCount = existingValues.size(); for (int i = 0; index == -1 && i < existingCount; i++) if (existingValues.get(i).equalsIgnoreCase(fileSpec)) index = i; if (index == -1) // did not find the file spec to be removed - nothing to do return; existingValues.remove(index); // set new preference value String newValue = Util.toListString(existingValues.toArray()); ContentType.setPreference(contentTypeNode, key, newValue); try { contentTypeNode.flush(); } catch (BackingStoreException bse) { String message = NLS.bind(ContentMessages.content_errorSavingSettings, contentTypeId); IStatus status = new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, bse); throw new CoreException(status); } } public ContentTypeSettings(ContentType contentType, IScopeContext context) { this.context = context; this.contentType = contentType; } @Override public void addFileSpec(String fileSpec, int type) throws CoreException { addFileSpec(context, contentType.getId(), fileSpec, type); } @Override public ContentType getContentType() { return contentType; } @Override public String getDefaultCharset() { return getDefaultProperty(IContentDescription.CHARSET); } @Override public String getDefaultProperty(final QualifiedName key) { final Preferences contentTypePrefs = ContentTypeManager.getInstance().getPreferences(context); try { String propertyValue = internalGetDefaultProperty(contentType, contentTypePrefs, key); return "".equals(propertyValue) ? null : propertyValue; //$NON-NLS-1$ } catch (BackingStoreException e) { return null; } } @Override public String[] getFileSpecs(int type) { return getFileSpecs(context, contentType.getId(), type); } @Override public String getId() { return contentType.getId(); } @Override public void removeFileSpec(String fileSpec, int type) throws CoreException { removeFileSpec(context, contentType.getId(), fileSpec, type); } @Override public void setDefaultCharset(String userCharset) throws CoreException { Preferences contentTypeNode = ContentTypeManager.getInstance().getPreferences(context).node(contentType.getId()); ContentType.setPreference(contentTypeNode, ContentType.PREF_DEFAULT_CHARSET, userCharset); try { contentTypeNode.flush(); } catch (BackingStoreException bse) { String message = NLS.bind(ContentMessages.content_errorSavingSettings, contentType.getId()); IStatus status = new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, bse); throw new CoreException(status); } } @Override public boolean isUserDefined() { return getContentType().isUserDefined(); } }