/*******************************************************************************
* Copyright (c) 2009 Fraunhofer IWU 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:
* Fraunhofer IWU - initial API and implementation
*******************************************************************************/
package net.enilink.commons.ui.editor;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.forms.widgets.FormToolkit;
public abstract class AbstractEditorPart implements IEditorPart {
private Set<IEditorPart> parts = new HashSet<IEditorPart>();
private IEditorForm form;
private boolean dirty = false, stale = false;
private boolean ignoreChanges = false;
private Display display;
@Override
public void activate() {
for (IEditorPart part : parts) {
part.activate();
}
}
public void addPart(IEditorPart part) {
addPart(part, true);
}
public void addPart(IEditorPart part, boolean initialize) {
if (initialize) {
initialize(part);
}
parts.add(part);
}
protected void addTextBorder(Control control) {
control.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
}
protected void asyncExec(Runnable runnable) {
display.asyncExec(runnable);
}
public void commit(boolean onSave) {
commitParts(onSave);
}
protected Collection<IEditorPart> getParts() {
return parts;
}
protected void commitParts(boolean onSave) {
for (IEditorPart part : parts) {
if (part.isDirty()) {
part.commit(onSave);
}
}
}
@Override
public void deactivate() {
for (IEditorPart part : parts) {
part.deactivate();
}
}
public void dispose() {
disposeParts();
form = null;
}
protected void disposeParts() {
for (IEditorPart part : parts) {
part.dispose();
}
}
protected IEditorForm getForm() {
return form;
}
protected Shell getShell() {
return form.getShell();
}
protected EditorWidgetFactory getWidgetFactory() {
return getForm().getWidgetFactory();
}
protected void initialize(IEditorPart subPart) {
subPart.initialize(getForm());
}
public void initialize(IEditorForm form) {
this.form = form;
this.display = form.getShell().getDisplay();
}
public boolean isDirty() {
return dirty || partsDirty();
}
public boolean isStale() {
return stale;
}
private boolean partsDirty() {
for (IEditorPart part : parts) {
if (part.isDirty()) {
return true;
}
}
return false;
}
@Override
public boolean setFocus() {
for (IEditorPart part : parts) {
if (part.setFocus()) {
return true;
}
}
return false;
}
@Override
public void setInput(Object input) {
}
public void refresh() {
setDirty(false);
setStale(false);
}
protected void refreshParts() {
for (IEditorPart part : parts) {
part.refresh();
}
}
public void removePart(IEditorPart part) {
parts.remove(part);
}
public void setDirty(boolean dirty) {
if (ignoreChanges) {
return;
}
if (this.dirty != dirty) {
this.dirty = dirty;
syncExec(new Runnable() {
public void run() {
getForm().dirtyStateChanged();
}
});
}
}
public boolean setEditorInput(Object input) {
boolean partResult = false;
for (IEditorPart part : parts) {
boolean result = part.setEditorInput(input);
if (result) {
partResult = true;
}
}
return partResult;
}
protected void setIgnoreChanges(boolean ignoreChanges) {
this.ignoreChanges = ignoreChanges;
}
protected boolean getIgnoreChanges() {
return ignoreChanges;
}
public void setStale(boolean stale) {
if (ignoreChanges)
return;
if (this.stale != stale) {
this.stale = stale;
syncExec(new Runnable() {
public void run() {
getForm().staleStateChanged();
}
});
}
}
protected void syncExec(Runnable runnable) {
if (Display.getCurrent() != null) {
runnable.run();
} else {
this.display.syncExec(runnable);
}
}
}