/* * Copyright 2010 The Rabbit Eclipse Plug-in Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package rabbit.ui.internal.pages; import rabbit.ui.internal.util.ICategory; import rabbit.ui.internal.util.ICategoryProvider; import rabbit.ui.internal.util.IVisualProvider; import rabbit.ui.internal.util.TreePathValueProvider; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newArrayListWithCapacity; import com.google.common.base.Joiner; import com.google.common.base.Splitter; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.ui.IMemento; import java.util.List; /** * Helper class for saving/restoring states. */ class StateHelper { private static final char SEPARATOR = ','; private static final String WIDTHS = "widths"; private static final String CATEGORIES = "categories"; private static final String VISUAL_CATEGORY = "visualCategory"; /** * Creates a new {@link StateHelper}. * @param parentMemento the parent {@link IMemento}. * @param childId the ID of this child element, used when saving/restoring * states. * @throws NullPointerException if any argument is null. */ static StateHelper of(IMemento parentMemento, String childId) { return new StateHelper(parentMemento, childId); } private final IMemento parentMemento; private final String childId; /** * @param parentMemento * @param childId * @throws NullPointerException if any argument is null. */ private StateHelper(IMemento parentMemento, String childId) { this.parentMemento = checkNotNull(parentMemento); this.childId = checkNotNull(childId); } /** * Restores the previously saved categories. Does nothing if no categories * found. * @param provider the provider to set the categories. * @return this * @throws NullPointerException if argument is null. * @see #saveCategories(Category...) */ StateHelper restoreCategories(ICategoryProvider provider) { checkNotNull(provider); List<Category> list = retrieveSavedCategories(); if (list != null) { provider.setSelected(list.toArray(new Category[list.size()])); } return this; } /** * Retrieve previously saved categories. Note that if no categories has been * saved, null is returned, not an empty collection, because an empty * collection of categories may have been saved. * @return a list of categories, or null if none has been saved. */ List<Category> retrieveSavedCategories() { IMemento m = getMemento(); String string = m.getString(CATEGORIES); if (string == null) { return null; } List<Category> result = newArrayList(); List<String> list = newArrayList(Splitter.on(SEPARATOR).split(string)); for (String str : list) { try { result.add(Enum.valueOf(Category.class, str)); } catch (IllegalArgumentException e) { // Ignore invalid ones System.err.println(getClass().getSimpleName() + " - retrieveSavedCategories: " + e.getMessage()); } } return result; } /** * Restores the column widths. If no previously saved widths found, or if the * number of widths saved and the number of columns to be restored doesn't * match, no action will be performed. * @param columns the columns to set the widths. * @return this * @throws NullPointerException if {@code columns} is null or contains null. * @see #saveColumnWidths(TreeColumn[]) */ StateHelper restoreColumnWidths(TreeColumn[] columns) { checkNotNull(columns); for (TreeColumn column : columns) { checkNotNull(column); } IMemento m = getMemento(); String widthString = m.getString(WIDTHS); if (widthString == null) { return this; } List<String> list = newArrayList(Splitter.on(SEPARATOR).split(widthString)); if (list.size() != columns.length) { return this; } for (int i = 0; i < columns.length; i++) { try { columns[i].setWidth(Integer.parseInt(list.get(i))); } catch (NumberFormatException e) { System.err.println(getClass().getSimpleName() + " - restoreColumnWidths: " + e.getMessage()); } } return this; } /** * Saves the given categories. * @param categories the categories to be saved. * @return this * @throws NullPointerException if argument contains null. * @see #restoreCategories(ICategoryProvider) */ StateHelper saveCategories(Category... categories) { for (Category c : categories) { checkNotNull(c); } IMemento m = getMemento(); String string = Joiner.on(SEPARATOR).join(categories); m.putString(CATEGORIES, string); return this; } /** * Saves the column widths of the given columns. * @param columns the columns. * @return this * @throws NullPointerException if {@code columns} is null or contains null. * @see #restoreColumnWidths(TreeColumn[]) */ StateHelper saveColumnWidths(TreeColumn[] columns) { checkNotNull(columns); for (TreeColumn column : columns) { checkNotNull(column); } IMemento m = getMemento(); List<Integer> widths = newArrayListWithCapacity(columns.length); for (TreeColumn column : columns) { widths.add(Integer.valueOf(column.getWidth())); } String widthString = Joiner.on(SEPARATOR).join(widths); m.putString(WIDTHS, widthString); return this; } /** * Saves the given visual category. * @param category the category to be saved. * @return this. * @throws NullPointerException if argument is null. * @see TreePathValueProvider#getVisualCategory() * @see TreePathValueProvider#setVisualCategory(ICategory) */ StateHelper saveVisualCategory(Category category) { checkNotNull(category); IMemento m = getMemento(); m.putString(VISUAL_CATEGORY, category.toString()); return this; } /** * Retrieve the previously saved visual category. * @return the category, or null. */ Category retrieveSavedVisualCategory() { IMemento m = getMemento(); String str = m.getString(VISUAL_CATEGORY); if (str == null) { return null; } try { return Enum.valueOf(Category.class, str); } catch (IllegalArgumentException e) { // Ignore invalid System.err.println(getClass().getSimpleName() + " - retrieveSavedVisualCategory: " + e.getMessage()); } return null; } /** * Restores the previously saved visual category. If no saved category found, * no action will be taken. * @param provider the provider to set the category. * @return this * @throws NullPointerException if argument is null. * @see IVisualProvider#setVisualCategory(ICategory) */ StateHelper restoreVisualCategory(IVisualProvider provider) { checkNotNull(provider); Category c = retrieveSavedVisualCategory(); if (c != null) { provider.setVisualCategory(c); } return this; } private IMemento getMemento() { IMemento m = parentMemento.getChild(childId); if (m == null) { return parentMemento.createChild(childId); } return m; } }