/*******************************************************************************
* Copyright (c) 2000, 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
* Exadel, Inc.
* Red Hat, Inc.
*******************************************************************************/
package org.jboss.tools.common.text.xml.xpl;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ResourceBundle;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.TextEditorAction;
import org.eclipse.wst.sse.ui.StructuredTextEditor;
import org.jboss.tools.common.text.xml.IOccurrencePreferenceProvider;
import org.jboss.tools.common.text.xml.XmlEditorPlugin;
import org.jboss.tools.jst.jsp.preferences.xpl.Messages;
import org.jboss.tools.jst.jsp.preferences.xpl.OccurrencePreferenceConstants;
import org.jboss.tools.jst.jsp.preferences.xpl.PreferenceKeyGenerator;
/**
* A toolbar action which toggles the presentation model of the
* connected text editor. The editor shows either the highlight range
* only or always the whole document.
*/
public class ToggleOccurencesMarkUpAction extends TextEditorAction implements IPropertyChangeListener {
IPreferenceStore fPreferenceStore;
IOccurrencePreferenceProvider fOccurrencePreferenceProvider;
String fEditorId;
String fKey;
/**
* Constructs and updates the action.
*/
public ToggleOccurencesMarkUpAction() {
super(Messages.getResourceBundle(), "ToggleOccurencesMarkUpAction.", null); //$NON-NLS-1$
}
/**
* Retargets this action to the given editor.
*
* @param editor the new editor, or <code>null</code> if none
*/
public void setEditor(ITextEditor editor) {
super.setEditor(editor);
if(editor == null) {
dispose();
return;
}
fOccurrencePreferenceProvider = null;
StructuredTextEditor sse = getStructuredTextEditor(getTextEditor());
if (sse instanceof IOccurrencePreferenceProvider) {
fOccurrencePreferenceProvider = (IOccurrencePreferenceProvider)sse;
if (fOccurrencePreferenceProvider != null && fOccurrencePreferenceProvider.getOccurrencePreferenceProvider() != null) {
fEditorId = fOccurrencePreferenceProvider.getOccurrencePreferenceProvider().getEditorId();
fKey = PreferenceKeyGenerator.generateKey(
OccurrencePreferenceConstants.EDITOR_MARK_OCCURRENCES,
fEditorId);
}
}
update();
}
private StructuredTextEditor getStructuredTextEditor(ITextEditor editor) {
if (editor == null) return null;
if (editor instanceof StructuredTextEditor) return (StructuredTextEditor)editor;
return (StructuredTextEditor)editor.getAdapter(StructuredTextEditor.class);
}
protected void initialize(ResourceBundle bundle, String prefix) {
String labelKey= "label"; //$NON-NLS-1$
String tooltipKey= "tooltip"; //$NON-NLS-1$
String imageKey= "image"; //$NON-NLS-1$
String disabledImageKey= "disabledImage"; //$NON-NLS-1$
String descriptionKey= "description"; //$NON-NLS-1$
if (prefix != null && prefix.length() > 0) {
labelKey= prefix + labelKey;
tooltipKey= prefix + tooltipKey;
imageKey= prefix + imageKey;
disabledImageKey= prefix + disabledImageKey;
descriptionKey= prefix + descriptionKey;
}
setText(getString(bundle, labelKey, labelKey));
setToolTipText(getString(bundle, tooltipKey, null));
setDescription(getString(bundle, descriptionKey, null));
String relPath= getString(bundle, imageKey, null);
ImageDescriptor id = ImageDescriptor.createFromFile(ToggleOccurencesMarkUpAction.class, relPath); //$NON-NLS-1$
if (id != null) {
setImageDescriptor(id);
}
relPath = getString(bundle, disabledImageKey, null);
id= ImageDescriptor.createFromFile(ToggleOccurencesMarkUpAction.class, relPath); //$NON-NLS-1$
if (id != null) {
setDisabledImageDescriptor(id);
}
}
public int getStyle() {
return AS_RADIO_BUTTON;
}
public void run() {
boolean markOccurences = false;
// determine if action should be enabled or not
markOccurences = fPreferenceStore.getBoolean(fKey);
fPreferenceStore.setValue(fKey, !markOccurences);
}
static int listenerCount = 0;
/**
* Enables and initialzies the action, or disables.
* @see org.eclipse.ui.texteditor.TextEditorAction#update()
*/
public void update() {
IPreferenceStore newStore = null;
super.update();
newStore = ((fOccurrencePreferenceProvider == null
|| fOccurrencePreferenceProvider.getOccurrencePreferenceProvider() == null)
? null : fOccurrencePreferenceProvider.getOccurrencePreferenceProvider().getPreferenceStore());
if (newStore != fPreferenceStore) {
if (fPreferenceStore != null) {
fPreferenceStore.removePropertyChangeListener(this);
}
fPreferenceStore = newStore;
if (fPreferenceStore != null) {
fPreferenceStore.addPropertyChangeListener(this);
}
}
boolean markOccurences = false;
boolean enabled = false;
// determine if action should be enabled or not
if(fPreferenceStore != null) {
markOccurences = fPreferenceStore.getBoolean(fKey);
}
enabled = (getTextEditor() != null);
setChecked(markOccurences);
setEnabled(enabled);
}
/*
* @see IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
update();
}
private static URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
URL base = null;
try {
base = FileLocator.resolve(XmlEditorPlugin.getDefault().getBundle().getEntry("/")); //$NON-NLS-1$
} catch (IOException e) {
XmlEditorPlugin.getPluginLog().logError(e);
return null;
}
StringBuffer buffer = new StringBuffer(prefix);
buffer.append('/');
buffer.append(name);
return new URL(base, buffer.toString());
}
public void dispose() {
if (fPreferenceStore != null) {
fPreferenceStore.removePropertyChangeListener(this);
fPreferenceStore = null;
}
fOccurrencePreferenceProvider = null;
}
}