blob: e349a1cb04a9af6937237c076926040e6866019a [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.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/org/documents/epl-v10.php
*
* 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.android.ide.eclipse.adt.internal.editors.layout.gle2;
import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.IPostSelectionProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
* JFace {@link Viewer} wrapper around {@link LayoutCanvas}.
* <p/>
* The viewer is owned by {@link GraphicalEditorPart}.
* <p/>
* The viewer is an {@link ISelectionProvider} instance and is set as the
* site's main {@link ISelectionProvider} by the editor part. Consequently
* canvas' selection changes are broadcasted to anyone listening, which includes
* the part itself as well as the associated outline and property sheet pages.
*/
class LayoutCanvasViewer extends Viewer implements IPostSelectionProvider {
private LayoutCanvas mCanvas;
private final LayoutEditorDelegate mEditorDelegate;
public LayoutCanvasViewer(LayoutEditorDelegate editorDelegate,
RulesEngine rulesEngine,
Composite parent,
int style) {
mEditorDelegate = editorDelegate;
mCanvas = new LayoutCanvas(editorDelegate, rulesEngine, parent, style);
mCanvas.getSelectionManager().addSelectionChangedListener(mSelectionListener);
}
private ISelectionChangedListener mSelectionListener = new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
fireSelectionChanged(event);
firePostSelectionChanged(event);
}
};
@Override
public Control getControl() {
return mCanvas;
}
/**
* Returns the underlying {@link LayoutCanvas}.
* This is the same control as returned by {@link #getControl()} but clients
* have it already casted in the right type.
* <p/>
* This can never be null.
* @return The underlying {@link LayoutCanvas}.
*/
public LayoutCanvas getCanvas() {
return mCanvas;
}
/**
* Returns the current layout editor's input.
*/
@Override
public Object getInput() {
return mEditorDelegate.getEditor().getEditorInput();
}
/**
* Unused. We don't support switching the input.
*/
@Override
public void setInput(Object input) {
}
/**
* Returns a new {@link TreeSelection} where each {@link TreePath} item
* is a {@link CanvasViewInfo}.
*/
@Override
public ISelection getSelection() {
return mCanvas.getSelectionManager().getSelection();
}
/**
* Sets a new selection. <code>reveal</code> is ignored right now.
* <p/>
* The selection can be null, which is interpreted as an empty selection.
*/
@Override
public void setSelection(ISelection selection, boolean reveal) {
if (mEditorDelegate.getEditor().getIgnoreXmlUpdate()) {
return;
}
mCanvas.getSelectionManager().setSelection(selection);
}
/** Unused. Refreshing is done solely by the owning {@link LayoutEditorDelegate}. */
@Override
public void refresh() {
// ignore
}
public void dispose() {
if (mSelectionListener != null) {
mCanvas.getSelectionManager().removeSelectionChangedListener(mSelectionListener);
}
if (mCanvas != null) {
mCanvas.dispose();
mCanvas = null;
}
}
// ---- Implements IPostSelectionProvider ----
private ListenerList mPostChangedListeners = new ListenerList();
@Override
public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
mPostChangedListeners.add(listener);
}
@Override
public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
mPostChangedListeners.remove(listener);
}
protected void firePostSelectionChanged(final SelectionChangedEvent event) {
Object[] listeners = mPostChangedListeners.getListeners();
for (int i = 0; i < listeners.length; i++) {
final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
SafeRunnable.run(new SafeRunnable() {
@Override
public void run() {
l.selectionChanged(event);
}
});
}
}
}