/******************************************************************************* * Copyright (c) 2008 Olivier Moises * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Olivier Moises- initial API and implementation *******************************************************************************/ package org.eclipse.wazaabi.ide.ui.editparts.commands; import java.util.ArrayList; import java.util.List; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.wazaabi.mm.core.styles.StyleRule; import org.eclipse.wazaabi.mm.core.widgets.Widget; public abstract class AbstractSetUniqueStyleRuleCommand extends TransactionalEditingDomainCommand { private String propertyName; private Widget widget; private Object newValue; private List<RuleEntry> previousRuleEntries = new ArrayList<RuleEntry>(); private StyleRule modifiedStyleRule = null; private class RuleEntry { private final int index; private final StyleRule styleRule; public RuleEntry(int index, StyleRule styleRule) { this.index = index; this.styleRule = (StyleRule) EcoreUtil.copy(styleRule); } public int getIndex() { return index; } public StyleRule getStyleRule() { return styleRule; } }; protected void gatherPreviousRuleEntries() { for (int i = 0; i < getWidget().getStyleRules().size(); i++) if (getPropertyName().equals( getWidget().getStyleRules().get(i).getPropertyName())) previousRuleEntries.add(new RuleEntry(i, getWidget() .getStyleRules().get(i))); } protected void removeUnusedStyleRules() { if (previousRuleEntries.size() < 2) return; // remove all the rules except the first one for (int i = previousRuleEntries.size() - 1; i > 0; i--) getWidget().getStyleRules().remove( previousRuleEntries.get(i).getIndex()); } @Override protected void doExecute() { gatherPreviousRuleEntries(); removeUnusedStyleRules(); if (previousRuleEntries.size() == 0) { modifiedStyleRule = createNewStyleRule(); modifiedStyleRule.setPropertyName(getPropertyName()); } else modifiedStyleRule = getWidget().getStyleRules().get( previousRuleEntries.get(0).getIndex()); doRedo(); } @Override protected void doRedo() { setStyleRuleValue(modifiedStyleRule, getNewValue()); if (previousRuleEntries.size() == 0) getWidget().getStyleRules().add(modifiedStyleRule); } @Override protected void doUndo() { if (previousRuleEntries.size() == 0) getWidget().getStyleRules().remove(modifiedStyleRule); else { setStyleRuleValue( modifiedStyleRule, getStyleRuleValue(previousRuleEntries.get(0).getStyleRule())); for (int i = 1; i < previousRuleEntries.size(); i++) getWidget().getStyleRules().add( previousRuleEntries.get(i).getIndex(), previousRuleEntries.get(i).getStyleRule()); } } public String getPropertyName() { return propertyName; } public void setPropertyName(String propertyName) { this.propertyName = propertyName; } public Widget getWidget() { return widget; } public void setWidget(Widget widget) { this.widget = widget; } public Object getNewValue() { return newValue; } public void setNewValue(Object newValue) { this.newValue = newValue; } protected abstract StyleRule createNewStyleRule(); protected abstract void setStyleRuleValue(StyleRule rule, Object newValue); protected abstract Object getStyleRuleValue(StyleRule rule); @Override public boolean canExecute() { return super.canExecute() && getPropertyName() != null && !"".equals(getPropertyName()) && getWidget() != null; //$NON-NLS-1$ } @Override public boolean canUndo() { return super.canUndo() && modifiedStyleRule != null; } }