/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.undo;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.icons.impl.XModelObjectIcon;
public class XChangeSetUndo extends XUndoableImpl {
protected XModel model = null;
protected String path = null;
protected String[][] attr = null; // name, oldvalue, newvalue
public XChangeSetUndo(XModelObject object, String[][] attr) {
model = object.getModel();
path = object.getPath();
this.attr = attr;
for (int i = 0; i < attr.length; i++)
this.attr[i][2] = object.getAttributeValue(attr[i][0]);
String[] types = object.getModelEntity().getRenderer().getIconNames();
String iconType = types.length == 0 ? "main" : object.getModelEntity().getRenderer().getIconNames()[0]; //$NON-NLS-1$
icon = new XModelObjectIcon(object).getEclipseImage0(new String[]{iconType});
description = createDescription(object);
kind = EDIT;
}
public void doUndo() {
execute(1);
}
public void doRedo() {
execute(2);
}
protected void execute(int k) {
XModelObject object = model.getByPath(path);
if(object == null) return;
for (int i = 0; i < attr.length; i++) {
object.setAttributeValue(attr[i][0], attr[i][k]);
}
object.setModified(true);
path = object.getPath();
}
protected boolean merge(XUndoableImpl u) {
if(!(u instanceof XChangeSetUndo)) return false;
XChangeSetUndo c = (XChangeSetUndo)u;
if(c == null || path == null || attr == null || !path.equals(c.path) || attr.length != c.attr.length) return false;
if(attr.length != 1) return false;
if(!attr[0][0].equals(c.attr[0][0])) return false;
attr[0][2] = c.attr[0][2];
return true;
}
protected String createDescription(XModelObject o) {
return o.getAttributeValue(XModelObjectConstants.ATTR_ELEMENT_TYPE) + " " + //$NON-NLS-1$
o.getModelEntity().getRenderer().getTitle(o);
}
}