package org.csstudio.sds.ui.internal.pvlistview.preferences; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; public class PvSearchFolderPreferenceService { private static final String SERIALIZED_ITEM_REGEX = "([^,]+,(true|false),)+"; private static final String PV_SEARCH_FOLDER_ITEMS = "pv_search_folder_items"; private final IPreferenceStore preferenceStore; private final List<PvSearchFolderPreferenceChangeListener> listeners; public PvSearchFolderPreferenceService(IPreferenceStore preferenceStore) { assert preferenceStore != null : "Precondition failed: preferenceStore != null"; this.preferenceStore = preferenceStore; this.listeners = new ArrayList<PvSearchFolderPreferenceService.PvSearchFolderPreferenceChangeListener>(); preferenceStore.setDefault(PV_SEARCH_FOLDER_ITEMS, ""); preferenceStore.addPropertyChangeListener(new IPropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { if(event.getProperty().equals(PV_SEARCH_FOLDER_ITEMS)) { for (PvSearchFolderPreferenceChangeListener listener : listeners) { listener.preferencesChanged(); } } } }); } public void saveLibraryFolderPreferenceItems( List<PvSearchFolderPreferenceItem> items) { assert items != null : "Precondition failed: items != null"; preferenceStore.setValue(PV_SEARCH_FOLDER_ITEMS, serializeItems(items)); } public List<PvSearchFolderPreferenceItem> loadPvSearchItems() { List<PvSearchFolderPreferenceItem> result; String serializedItems = preferenceStore .getString(PV_SEARCH_FOLDER_ITEMS); if (serializedItems.length() > 0) { result = deserializeItems(serializedItems); } else { result = new ArrayList<PvSearchFolderPreferenceItem>(); } assert result != null : "Postcondition failed: result != null"; return result; } public void addChangeListener(PvSearchFolderPreferenceChangeListener changeListener) { assert changeListener != null : "Precondition failed: changeListener != null"; this.listeners.add(changeListener); } public void removeChangeListener(PvSearchFolderPreferenceChangeListener changeListener) { assert changeListener != null : "Precondition failed: changeListener != null"; this.listeners.remove(changeListener); } protected static String serializeItems( List<PvSearchFolderPreferenceItem> items) { assert items != null : "Precondition failed: items != null"; assert !items.isEmpty() : "Precondition failed: !items.isEmpty()"; StringBuffer result = new StringBuffer(""); for (PvSearchFolderPreferenceItem libraryFolderPreferenceItem : items) { result.append(libraryFolderPreferenceItem.getFolderPath() + "," + libraryFolderPreferenceItem.isChecked() + ","); } assert result != null : "Postcondition failed: result != null"; return result.toString(); } protected static List<PvSearchFolderPreferenceItem> deserializeItems( String serializedItemsString) { assert serializedItemsString != null : "Precondition failed: serializedItemsString != null"; assert isValidSerializedItemList(serializedItemsString) : "Precondition failed: isValidSerializedItemList(serializedItemsString)"; String[] splitStrings = serializedItemsString.split(","); ArrayList<PvSearchFolderPreferenceItem> result = new ArrayList<PvSearchFolderPreferenceItem>(); PvSearchFolderPreferenceItem currentItem = null; for (int stringIndex = 0; stringIndex < splitStrings.length; stringIndex++) { if (stringIndex % 2 == 0) { // current element is folder path currentItem = new PvSearchFolderPreferenceItem( splitStrings[stringIndex]); } else { // current element is checked state of folder currentItem.setChecked(Boolean .parseBoolean(splitStrings[stringIndex])); result.add(currentItem); } } return result; } protected static boolean isValidSerializedItemList( String serializedItemsString) { assert serializedItemsString != null : "Precondition failed: serializedItemsString != null"; return serializedItemsString.matches(SERIALIZED_ITEM_REGEX); } public interface PvSearchFolderPreferenceChangeListener { void preferencesChanged(); } }