/**
* Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.ui;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import org.python.pydev.plugin.preferences.PydevPrefs;
import org.python.pydev.shared_core.SharedCorePlugin;
import org.python.pydev.shared_core.callbacks.CallbackWithListeners;
import org.python.pydev.shared_core.callbacks.ICallbackWithListeners;
public abstract class ViewPartWithOrientation extends ViewPart implements IPropertyChangeListener {
protected Composite fParent;
protected int fCurrentOrientation;
private int orientationPreference;
protected ViewPartWithOrientation() {
String orientationPreferencesKey = getOrientationPreferencesKey();
if (!SharedCorePlugin.inTestMode()) {
IPreferenceStore preferenceStore = PydevPrefs.getPreferenceStore();
orientationPreference = preferenceStore.getInt(orientationPreferencesKey);
PydevPrefs.getPreferenceStore().addPropertyChangeListener(this);
}
}
/*default*/static final int PREFERENCES_VIEW_ORIENTATION_AUTOMATIC = 0;
/*default*/static final int PREFERENCES_VIEW_ORIENTATION_HORIZONTAL = 1;
/*default*/static final int PREFERENCES_VIEW_ORIENTATION_VERTICAL = 2;
//Subclasses will be passed these constants!
public static final int VIEW_ORIENTATION_HORIZONTAL = 1;
public static final int VIEW_ORIENTATION_VERTICAL = 2;
@SuppressWarnings("rawtypes")
public final ICallbackWithListeners onControlCreated = new CallbackWithListeners();
@SuppressWarnings("rawtypes")
public final ICallbackWithListeners onControlDisposed = new CallbackWithListeners();
@Override
public void createPartControl(Composite parent) {
fParent = parent;
addResizeListener(parent);
}
public abstract String getOrientationPreferencesKey();
/*default*/int getOrientationPreferenceValue() {
return orientationPreference;
}
protected void addOrientationPreferences(IMenuManager menuManager) {
menuManager.add(new SetOrientationAction(this));
}
protected void updateOrientation() {
switch (orientationPreference) {
case PREFERENCES_VIEW_ORIENTATION_HORIZONTAL:
setNewOrientation(VIEW_ORIENTATION_HORIZONTAL);
break;
case PREFERENCES_VIEW_ORIENTATION_VERTICAL:
setNewOrientation(VIEW_ORIENTATION_VERTICAL);
break;
default:
//automatic
Point size = fParent.getSize();
if (size.x != 0 && size.y != 0) {
if (size.x > size.y) {
setNewOrientation(VIEW_ORIENTATION_HORIZONTAL);
} else {
setNewOrientation(VIEW_ORIENTATION_VERTICAL);
}
}
}
}
private void addResizeListener(Composite parent) {
parent.addControlListener(new ControlListener() {
@Override
public void controlMoved(ControlEvent e) {
}
@Override
public void controlResized(ControlEvent e) {
updateOrientation();
}
});
}
protected abstract void setNewOrientation(int orientation);
@Override
public void dispose() {
PydevPrefs.getPreferenceStore().removePropertyChangeListener(this);
super.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(this.getOrientationPreferencesKey())) {
orientationPreference = (Integer) event.getNewValue();
updateOrientation();
}
}
}