/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.internal.editpolicies; import java.util.HashMap; import java.util.Map; import org.xmind.core.ISheet; import org.xmind.core.IWorkbook; import org.xmind.core.style.IStyle; import org.xmind.core.style.IStyleSheet; import org.xmind.gef.IViewer; import org.xmind.gef.Request; import org.xmind.gef.command.ICommandStack; import org.xmind.ui.commands.CommandBuilder; import org.xmind.ui.commands.ModifyThemeCommand; import org.xmind.ui.mindmap.MindMapUI; import org.xmind.ui.style.Styles; public class ModifyThemeCommandBuilder extends CommandBuilder { private IStyle sourceTheme; private Map<IWorkbook, IStyle> appliedThemes = null; public ModifyThemeCommandBuilder(IViewer viewer, ICommandStack commandStack, IStyle theme) { super(viewer, commandStack); this.sourceTheme = theme; } public ModifyThemeCommandBuilder(IViewer viewer, CommandBuilder delegate, IStyle theme) { super(viewer, delegate); this.sourceTheme = theme; } public IStyle getTheme() { return sourceTheme; } public void modify(ISheet sheet) { IStyle appliedTheme = getAppliedTheme(sheet); if (appliedTheme == null) { add(new ModifyThemeCommand(sheet, null), true); } else { add(new ModifyThemeCommand(sheet, appliedTheme.getId()), true); } ModifyStyleCommandBuilder modifyStyleBuilder = new ModifyStyleCommandBuilder( getViewer(), this, createSheetStyleRequest(appliedTheme)); modifyStyleBuilder.modify(sheet); } private Request createSheetStyleRequest(IStyle appliedTheme) { Request request = new Request(MindMapUI.REQ_MODIFY_STYLE) .setViewer(getViewer()); request.setParameter(MindMapUI.PARAM_STYLE_PREFIX + Styles.MultiLineColors, getMapStyleValue(appliedTheme, Styles.MultiLineColors)); request.setParameter(MindMapUI.PARAM_STYLE_PREFIX + Styles.LineTapered, getMapStyleValue(appliedTheme, Styles.LineTapered)); return request; } private String getMapStyleValue(IStyle theme, String key) { if (theme == null) return null; IStyle mapStyle = theme.getDefaultStyle(Styles.FAMILY_MAP); if (mapStyle == null) return null; return mapStyle.getProperty(key); } private IStyle getAppliedTheme(ISheet sheet) { if (sourceTheme == null || sourceTheme.isEmpty() || MindMapUI.getResourceManager().getBlankTheme().equals( sourceTheme)) return null; IWorkbook workbook = sheet.getOwnedWorkbook(); if (workbook == null) return sourceTheme; if (appliedThemes == null) appliedThemes = new HashMap<IWorkbook, IStyle>(); if (!appliedThemes.containsKey(workbook)) { IStyle appliedTheme = createAppliedTheme(workbook); appliedThemes.put(workbook, appliedTheme); } return appliedThemes.get(workbook); } private IStyle createAppliedTheme(IWorkbook workbook) { IStyleSheet ss = workbook.getStyleSheet(); return ss.importStyle(sourceTheme); } }