/******************************************************************************* * Copyright (c) 2004, 2005 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.gef.examples.text.model.commands; import org.eclipse.gef.examples.text.model.Container; import org.eclipse.gef.examples.text.model.InlineContainer; import org.eclipse.gef.examples.text.model.ModelLocation; import org.eclipse.gef.examples.text.model.Style; import org.eclipse.gef.examples.text.model.TextRun; /** * Applies a boolean style such as BOLD to a range in the model. * @since 3.1 */ public class ApplyBooleanStyle extends MiniEdit { private TextRun begin; private int beginOffset; private Container container; private int endOffset; String[] keys; private TextRun middle; private Container parent; private TextRun right; Object[] values; public ApplyBooleanStyle(ModelLocation start, ModelLocation end, String keys[], Object values[]) { begin = (TextRun)start.model; parent = begin.getContainer(); beginOffset = start.offset; endOffset = end.offset; this.keys = keys; this.values = values; } public void apply() { right = begin.subdivideRun(endOffset); if (right.getText().length() == 0) right = null; middle = begin.subdivideRun(beginOffset); container = new InlineContainer(Container.TYPE_INLINE); for (int i = 0; i < keys.length; i++) { String key = keys[i]; if (key.equals(Style.PROPERTY_BOLD)) container.getStyle().setBold(((Boolean)values[i]).booleanValue()); else if (key.equals(Style.PROPERTY_FONT_SIZE)) container.getStyle().setFontHeight(((Integer)values[i]).intValue()); else if (key.equals(Style.PROPERTY_ITALIC)) container.getStyle().setItalic(((Boolean)values[i]).booleanValue()); else if (key.equals(Style.PROPERTY_UNDERLINE)) container.getStyle().setUnderline(((Boolean)values[i]).booleanValue()); else if (key.equals(Style.PROPERTY_FONT)) container.getStyle().setFontFamily((String)values[i]); } container.add(middle); int index = begin.getContainer().getChildren().indexOf(begin) + 1; if (right != null) parent.add(right, index); parent.add(container, index); if (begin.getText().length() == 0) parent.remove(begin); } public boolean canApply() { return true; } public ModelLocation getResultingLocation() { return new ModelLocation(middle, middle.size()); } public void rollback() { int index = parent.getChildren().indexOf(container); parent.remove(container); if (right != null) parent.remove(right); if (begin.getContainer() == null) parent.add(begin, index); begin.insertText(middle.getText(), begin.size()); if (right != null) begin.insertText(right.getText(), begin.size()); } }