package org.objectstyle.wolips.componenteditor.inspector; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.jdt.core.ElementChangedEvent; import org.eclipse.jdt.core.IElementChangedListener; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaElementDelta; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.TableColumn; import org.objectstyle.wolips.baseforuiplugins.utils.ListContentProvider; import org.objectstyle.wolips.bindings.utils.BindingReflectionUtils; import org.objectstyle.wolips.bindings.wod.BindingValueKey; import org.objectstyle.wolips.wodclipse.core.completion.WodParserCache; public class WOBrowserColumn extends Composite implements ISelectionProvider, ISelectionChangedListener, IElementChangedListener { private WOBrowser _browser; private List<ISelectionChangedListener> _listeners = new LinkedList<ISelectionChangedListener>(); private IType _type; private TableViewer _keysViewer; private Font _typeNameFont; private BindingsDragHandler _lineDragHandler; private IWOBrowserDelegate _delegate; private List<Object> _bindingValueKeys; public WOBrowserColumn(WOBrowser browser, IType type, Composite parent, int style) throws JavaModelException { super(parent, style); setBackground(parent.getBackground()); GridLayout layout = new GridLayout(1, false); layout.marginWidth = 0; layout.marginHeight = 0; layout.marginTop = 0; setLayout(layout); _browser = browser; _type = type; Label typeName = new Label(this, SWT.NONE); typeName.setBackground(getBackground()); Font originalFont = typeName.getFont(); FontData[] fontData = originalFont.getFontData(); _typeNameFont = new Font(originalFont.getDevice(), fontData[0].getName(), fontData[0].getHeight(), SWT.BOLD); typeName.setFont(_typeNameFont); GridData typeNameData = new GridData(GridData.FILL_HORIZONTAL); typeNameData.horizontalIndent = 3; typeName.setLayoutData(typeNameData); // typeName.setFont(typeName.getFont().) typeName.setText(type.getElementName()); Composite tableContainer = new Composite(this, SWT.NONE); tableContainer.setBackground(parent.getBackground()); tableContainer.setLayoutData(new GridData(GridData.FILL_BOTH)); _keysViewer = new TableViewer(tableContainer, SWT.FULL_SELECTION | SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER); _keysViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); _keysViewer.addSelectionChangedListener(this); _keysViewer.setContentProvider(new ListContentProvider()); _keysViewer.setLabelProvider(new WOBrowserColumnLabelProvider(_type, _keysViewer.getTable())); TableColumnLayout keysLayout = new TableColumnLayout(); tableContainer.setLayout(keysLayout); TableColumn nameColumn = new TableColumn(_keysViewer.getTable(), SWT.NONE); nameColumn.setText("Column 1"); // nameColumn.setMoveable(true); keysLayout.setColumnData(nameColumn, new ColumnWeightData(1, 200)); TableColumn iconColumn = new TableColumn(_keysViewer.getTable(), SWT.NONE); iconColumn.setText("Column 2"); // iconColumn.setMoveable(true); keysLayout.setColumnData(iconColumn, new ColumnWeightData(1, 20)); reload(); tableContainer.pack(); _lineDragHandler = new BindingsDragHandler(this); JavaCore.addElementChangedListener(this, ElementChangedEvent.POST_CHANGE); } public void elementChanged(ElementChangedEvent event) { for (IJavaElementDelta delta : event.getDelta().getAffectedChildren()) { if ((delta.getFlags() & IJavaElementDelta.F_CHILDREN) != 0) { IJavaElement element = delta.getElement(); if (element != null) { IJavaProject project = element.getJavaProject(); if (project != null && project.equals(_type.getJavaProject())) { Display.getDefault().asyncExec(new Runnable() { public void run() { try { reload(); } catch (JavaModelException e) { e.printStackTrace(); } } }); } } } } } public void reload() throws JavaModelException { // System.out.println("WOBrowserColumn.reload: Reloading " + // _type.getElementName() + " browser column."); Map<IType, Set<BindingValueKey>> typeKeys = BindingReflectionUtils.getGroupedBindingValueKeys("", _type, WodParserCache.getTypeCache()); List<Object> sortedBindingValueKeys = new LinkedList<Object>(); for (Map.Entry<IType, Set<BindingValueKey>> typeKeysEntry : typeKeys.entrySet()) { if (!_type.equals(typeKeysEntry.getKey())) { IType groupType = typeKeysEntry.getKey(); if (groupType != null) { sortedBindingValueKeys.add(groupType.getElementName()); } } sortedBindingValueKeys.addAll(typeKeysEntry.getValue()); } _bindingValueKeys = sortedBindingValueKeys; if (_keysViewer.getContentProvider() != null) { _keysViewer.setInput(_bindingValueKeys); } } public BindingValueKey getBindingValueKeyStartingWith(String partialKeyPath) { BindingValueKey matchingKey = null; for (Object keyObj : _bindingValueKeys) { if (keyObj instanceof BindingValueKey) { BindingValueKey key = (BindingValueKey)keyObj; if (key.getBindingName().startsWith(partialKeyPath)) { matchingKey = key; break; } } } return matchingKey; } public WOBrowser getBrowser() { return _browser; } public void setDelegate(IWOBrowserDelegate delegate) { _delegate = delegate; } public IWOBrowserDelegate getDelegate() { return _delegate; } @Override public void dispose() { JavaCore.removeElementChangedListener(this); _typeNameFont.dispose(); if (_lineDragHandler != null) { _lineDragHandler.dispose(); _lineDragHandler = null; } super.dispose(); } @Override public boolean setFocus() { return _keysViewer.getControl().setFocus(); } public IType getType() { return _type; } public TableViewer getViewer() { return _keysViewer; } public void addSelectionChangedListener(ISelectionChangedListener listener) { _listeners.add(listener); } public ISelection getSelection() { return _keysViewer.getSelection(); } public void removeSelectionChangedListener(ISelectionChangedListener listener) { _listeners.remove(listener); } public void setSelection(ISelection selection) { _keysViewer.setSelection(selection, true); } public void selectionChanged(SelectionChangedEvent event) { SelectionChangedEvent wrappedEvent = new SelectionChangedEvent(this, event.getSelection()); for (Iterator listeners = _listeners.iterator(); listeners.hasNext();) { ISelectionChangedListener listener = (ISelectionChangedListener) listeners.next(); listener.selectionChanged(wrappedEvent); } } public String getSelectedKeyPath() { String keyPath; if (_browser == null) { BindingValueKey bindingValueKey = getSelectedKey(); if (bindingValueKey == null) { keyPath = null; } else { keyPath = bindingValueKey.getBindingName(); } } else { keyPath = _browser.getSelectedKeyPath(); } return keyPath; } public BindingValueKey getSelectedKey() { BindingValueKey selectedKey = null; IStructuredSelection selection = (IStructuredSelection) getSelection(); if (selection != null) { Object selectedObject = selection.getFirstElement(); if (selectedObject instanceof BindingValueKey) { selectedKey = (BindingValueKey) selectedObject; } } return selectedKey; } }