/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.ui.internal.search;
import com.google.dart.tools.search.ui.text.AbstractTextSearchViewPage;
import com.google.dart.tools.ui.DartToolsPlugin;
import com.google.dart.tools.ui.internal.preferences.FontPreferencePage;
import com.google.dart.tools.ui.internal.util.SWTUtil;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
/**
* Abstract search results page that handles updates for font and color changes.
*/
abstract public class ThemedSearchResultPage extends AbstractTextSearchViewPage {
private class FontPropertyChangeListener implements IPropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent event) {
if (getViewer() != null) {
if (FontPreferencePage.EDITOR_BASE_FONT_KEY.equals(event.getProperty())) {
if (getViewer() instanceof TreeViewer) {
updateTreeFont();
} else {
updateTableFont();
}
getViewer().refresh();
}
}
}
}
private IPreferenceStore preferences;
private IPropertyChangeListener fontPropertyChangeListener = new FontPropertyChangeListener();
private IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
doPropertyChange(event);
}
};
protected ThemedSearchResultPage() {
preferences = DartToolsPlugin.getDefault().getCombinedPreferenceStore();
}
protected ThemedSearchResultPage(int supportedLayouts) {
super(supportedLayouts);
preferences = DartToolsPlugin.getDefault().getCombinedPreferenceStore();
}
@Override
public void dispose() {
super.dispose();
if (propertyChangeListener != null) {
getPreferences().removePropertyChangeListener(propertyChangeListener);
propertyChangeListener = null;
}
if (fontPropertyChangeListener != null) {
JFaceResources.getFontRegistry().removeListener(fontPropertyChangeListener);
fontPropertyChangeListener = null;
}
}
@Override
protected void configureTableViewer(final TableViewer viewer) {
viewer.getTable().setBackgroundMode(SWT.INHERIT_FORCE);
viewer.getTable().addListener(SWT.EraseItem, new Listener() {
@Override
public void handleEvent(Event event) {
SWTUtil.eraseSelection(event, viewer.getTable(), getPreferences());
}
});
JFaceResources.getFontRegistry().addListener(fontPropertyChangeListener);
updateTableFont();
getPreferences().addPropertyChangeListener(propertyChangeListener);
updateColors();
}
@Override
protected void configureTreeViewer(final TreeViewer viewer) {
viewer.getTree().setBackgroundMode(SWT.INHERIT_FORCE);
viewer.getTree().addListener(SWT.EraseItem, new Listener() {
@Override
public void handleEvent(Event event) {
SWTUtil.eraseSelection(event, viewer.getTree(), getPreferences());
}
});
JFaceResources.getFontRegistry().addListener(fontPropertyChangeListener);
updateTreeFont();
getPreferences().addPropertyChangeListener(propertyChangeListener);
updateColors();
}
protected void updateColors() {
StructuredViewer viewer = getViewer();
if (viewer instanceof TableViewer) {
SWTUtil.setColors(((TableViewer) viewer).getTable(), getPreferences());
} else {
SWTUtil.setColors(((TreeViewer) viewer).getTree(), getPreferences());
}
}
protected void updateTableFont() {
Font newFont = JFaceResources.getFont(FontPreferencePage.EDITOR_BASE_FONT_KEY);
TableViewer treeViewer = (TableViewer) getViewer();
Font oldFont = treeViewer.getTable().getFont();
Font font = SWTUtil.changeFontSize(oldFont, newFont);
treeViewer.getTable().setFont(font);
}
protected void updateTreeFont() {
Font newFont = JFaceResources.getFont(FontPreferencePage.EDITOR_BASE_FONT_KEY);
TreeViewer treeViewer = (TreeViewer) getViewer();
Font oldFont = treeViewer.getTree().getFont();
Font font = SWTUtil.changeFontSize(oldFont, newFont);
treeViewer.getTree().setFont(font);
}
private void doPropertyChange(PropertyChangeEvent event) {
SWTUtil.runUI(new Runnable() {
@Override
public void run() {
updateColors();
getViewer().refresh(false);
}
});
}
private IPreferenceStore getPreferences() {
return preferences;
}
}