package org.xmind.ui.internal.editor;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.xmind.ui.internal.MindMapMessages;
import org.xmind.ui.internal.MindMapUIPlugin;
import org.xmind.ui.prefs.PrefConstants;
public class OverviewCheckContribution extends ContributionItem
implements IPropertyChangeListener, Listener {
private static final String SHOW_OVERVIEW = "show_overview.png"; //$NON-NLS-1$
private static final String HIDE_OVERVIEW = "hide_overview.png"; //$NON-NLS-1$
private IPreferenceStore ps;
private Control control;
private ToolItem check;
private ResourceManager resources;
public OverviewCheckContribution() {
ps = MindMapUIPlugin.getDefault().getPreferenceStore();
}
public void fill(ToolBar parent, int index) {
Composite composite = new Composite(parent, SWT.NONE);
resources = new LocalResourceManager(JFaceResources.getResources(),
composite);
if (index < 0)
check = new ToolItem(parent, SWT.PUSH);
else
check = new ToolItem(parent, SWT.PUSH, index++);
check.setImage(
(Image) resources.get(getImageDescriptor(HIDE_OVERVIEW)));
check.setToolTipText(MindMapMessages.OverviewCheck_Overview_ON);
check.addListener(SWT.Selection, this);
updateCheck();
ps.removePropertyChangeListener(this);
ps.addPropertyChangeListener(this);
this.control = composite;
}
private void updateCheck() {
boolean value = getValue();
check.setImage((Image) resources.get(
getImageDescriptor(value ? HIDE_OVERVIEW : SHOW_OVERVIEW)));
check.setToolTipText(value ? MindMapMessages.OverviewCheck_Overview_OFF
: MindMapMessages.OverviewCheck_Overview_ON);
}
private boolean getValue() {
return ps.getBoolean(PrefConstants.SHOW_OVERVIEW);
}
@Override
public void handleEvent(final Event event) {
if (event.widget == check) {
event.display.timerExec(10, new Runnable() {
public void run() {
changeStatus(!getValue());
}
});
}
}
@Override
public void propertyChange(final PropertyChangeEvent event) {
if (control == null || control.isDisposed())
return;
control.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
update(event.getProperty());
}
});
}
public void update(String id) {
if (check == null || check.isDisposed() || ps == null)
return;
if (id == null || PrefConstants.SHOW_OVERVIEW.equals(id)) {
updateCheck();
}
}
private void changeStatus(boolean value) {
ps.setValue(PrefConstants.SHOW_OVERVIEW, value);
}
public void dispose() {
if (check != null) {
check.dispose();
check = null;
}
control = null;
if (ps != null) {
ps.removePropertyChangeListener(this);
ps = null;
}
}
private ImageDescriptor getImageDescriptor(String path) {
URL url;
try {
url = new URL(
"platform:/plugin/org.xmind.ui.mindmap/$nl$/icons/" + path); //$NON-NLS-1$
} catch (MalformedURLException e) {
return null;
}
URL locatedURL = FileLocator.find(url);
if (locatedURL != null)
url = locatedURL;
return ImageDescriptor.createFromURL(url);
}
}