📄 tableviewer.java
字号:
IBaseLabelProvider prov = getLabelProvider(); ITableLabelProvider tprov = null; ILabelProvider lprov = null; IViewerLabelProvider vprov = null; if(prov instanceof ILabelProvider) { lprov = (ILabelProvider) prov; } if (prov instanceof IViewerLabelProvider) { vprov = (IViewerLabelProvider) prov; } if (prov instanceof ITableLabelProvider) { tprov = (ITableLabelProvider) prov; } int columnCount = table.getColumnCount(); TableItem ti = item; getColorAndFontCollector().setFontsAndColors(element); // Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT - // TableViewer with 0 columns does not work for (int column = 0; column < columnCount || column == 0; column++) { // Similar code in TreeViewer.doUpdateItem() String text = "";//$NON-NLS-1$ Image image = null; tableColorAndFont.setFontsAndColors(ti,element,column); if (tprov == null) { if (column == 0) { ViewerLabel updateLabel = new ViewerLabel(item .getText(), item.getImage()); if(vprov != null) { buildLabel(updateLabel,element,vprov); } else{ if(lprov != null) { buildLabel(updateLabel,element,lprov); } } // As it is possible for user code to run the event //loop check here. if (item.isDisposed()) { unmapElement(element, item); return; } text = updateLabel.getText(); image = updateLabel.getImage(); } } else { text = tprov.getColumnText(element, column); image = tprov.getColumnImage(element, column); } //Avoid setting text to null if (text == null) { text = ""; //$NON-NLS-1$ } ti.setText(column, text); if (ti.getImage(column) != image) { ti.setImage(column, image); } } getColorAndFontCollector().applyFontsAndColors(ti); } } /** * Starts editing the given element. * * @param element * the element * @param column * the column number */ public void editElement(Object element, int column) { tableViewerImpl.editElement(element, column); } /** * Returns the cell editors of this table viewer. * * @return the list of cell editors */ public CellEditor[] getCellEditors() { return tableViewerImpl.getCellEditors(); } /** * Returns the cell modifier of this table viewer. * * @return the cell modifier */ public ICellModifier getCellModifier() { return tableViewerImpl.getCellModifier(); } /** * Returns the column properties of this table viewer. The properties must * correspond with the columns of the table control. They are used to * identify the column in a cell modifier. * * @return the list of column properties */ public Object[] getColumnProperties() { return tableViewerImpl.getColumnProperties(); } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.Viewer#getControl() */ public Control getControl() { return table; } /** * Returns the element with the given index from this table viewer. Returns * <code>null</code> if the index is out of range. * <p> * This method is internal to the framework. * </p> * * @param index * the zero-based index * @return the element at the given index, or <code>null</code> if the * index is out of range */ public Object getElementAt(int index) { if (index >= 0 && index < table.getItemCount()) { TableItem i = table.getItem(index); if (i != null) { return i.getData(); } } return null; } /** * The table viewer implementation of this <code>Viewer</code> framework * method returns the label provider, which in the case of table viewers * will be an instance of either <code>ITableLabelProvider</code> or * <code>ILabelProvider</code>. If it is an * <code>ITableLabelProvider</code>, then it provides a separate label * text and image for each column. If it is an <code>ILabelProvider</code>, * then it provides only the label text and image for the first column, and * any remaining columns are blank. */ public IBaseLabelProvider getLabelProvider() { return super.getLabelProvider(); } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.StructuredViewer#getSelectionFromWidget() */ protected List getSelectionFromWidget() { if(virtualManager != null) { return getVirtualSelection(); } Widget[] items = table.getSelection(); ArrayList list = new ArrayList(items.length); for (int i = 0; i < items.length; i++) { Widget item = items[i]; Object e = item.getData(); if (e != null) { list.add(e); } } return list; } /** * Get the virtual selection. Avoid calling SWT whenever possible * to prevent extra widget creation. * @return List of Object */ private List getVirtualSelection() { List result = new ArrayList(); int[] selectionIndices = getTable().getSelectionIndices(); if(getContentProvider() instanceof ILazyContentProvider){ ILazyContentProvider lazy = (ILazyContentProvider) getContentProvider(); for (int i = 0; i < selectionIndices.length; i++) { int selectionIndex = selectionIndices[i]; lazy.updateElement(selectionIndex);//Start the update Object element = getTable().getItem(selectionIndex).getData(); //Only add the element if it got updated. //If this is done deferred the selection will //be incomplete until selection is finished. if (element != null) { result.add(element); } } } else{ for (int i = 0; i < selectionIndices.length; i++) { Object element = null; //See if it is cached int selectionIndex = selectionIndices[i]; if (selectionIndex < virtualManager.cachedElements.length){ element = virtualManager.cachedElements[selectionIndex]; } if (element == null){ // Not cached so try the item's data TableItem item = getTable().getItem(selectionIndex); element = item.getData(); } if (element != null) { result.add(element); } } } return result; } /** * Returns this table viewer's table control. * * @return the table control */ public Table getTable() { return table; } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.ContentViewer#hookControl(org.eclipse.swt.widgets.Control) */ protected void hookControl(Control control) { super.hookControl(control); Table tableControl = (Table) control; tableControl.addMouseListener(new MouseAdapter() { public void mouseDown(MouseEvent e) { tableViewerImpl.handleMouseDown(e); } }); } /* * Returns the index where the item should be inserted. */ protected int indexForElement(Object element) { ViewerComparator comparator = getComparator(); if (comparator == null) { return table.getItemCount(); } int count = table.getItemCount(); int min = 0, max = count - 1; while (min <= max) { int mid = (min + max) / 2; Object data = table.getItem(mid).getData(); int compare = comparator.compare(this, data, element); if (compare == 0) { // find first item > element while (compare == 0) { ++mid; if (mid >= count) { break; } data = table.getItem(mid).getData(); compare = comparator.compare(this, data, element); } return mid; } if (compare < 0) { min = mid + 1; } else { max = mid - 1; } } return min; } /** * Initializes the table viewer implementation. */ private void initTableViewerImpl() { tableViewerImpl = new TableEditorImpl(this) { Rectangle getBounds(Item item, int columnNumber) { return ((TableItem) item).getBounds(columnNumber); } int getColumnCount() { return getTable().getColumnCount(); } Item[] getSelection() { return getTable().getSelection(); } void setEditor(Control w, Item item, int columnNumber) { tableEditor.setEditor(w, (TableItem) item, columnNumber); } void setSelection(StructuredSelection selection, boolean b) { TableViewer.this.setSelection(selection, b); } void showSelection() { getTable().showSelection(); } void setLayoutData(CellEditor.LayoutData layoutData) { tableEditor.grabHorizontal = layoutData.grabHorizontal; tableEditor.horizontalAlignment = layoutData.horizontalAlignment; tableEditor.minimumWidth = layoutData.minimumWidth; } void handleDoubleClickEvent() { Viewer viewer = getViewer(); fireDoubleClick(new DoubleClickEvent(viewer, viewer .getSelection())); fireOpen(new OpenEvent(viewer, viewer.getSelection())); } }; } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object, java.lang.Object) */ protected void inputChanged(Object input, Object oldInput) { getControl().setRedraw(false); try { // refresh() attempts to preserve selection, which we want here refresh(); } finally { getControl().setRedraw(true); } } /** * Inserts the given element into this table viewer at the given position. * If this viewer has a sorter, the position is ignored and the element is * inserted at the correct position in the sort order. * <p> * This method should be called (by the content provider) when elements have * been added to the model, in order to cause the viewer to accurately * reflect the model. This method only affects the viewer, not the model. * </p> * * @param element * the element * @param position * a 0-based position relative to the model, or -1 to indicate * the last position */ public void insert(Object element, int position) { tableViewerImpl.applyEditorValue(); if (getComparator() != null || hasFilters()) { add(element); return; } if (position == -1) { position = table.getItemCount(); } createItem(element,position); } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object) */ protected void internalRefresh(Object element) { internalRefresh(element, true); } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object, boolean) */ protected void internalRefresh(Object element, boolean updateLabels) { tableViewerImpl.applyEditorValue(); if (element == null || equals(element, getRoot())) { if(virtualManager == null) { internalRefreshAll(updateLabels); } else{ internalVirtualRefreshAll(); } } else { Widget w = findItem(element); if (w != null) { updateItem(w, element); } } } /** * Refresh all with virtual elements. * * @since 3.1 */ private void internalVirtualRefreshAll() { Object root = getRoot(); IContentProvider contentProvider = getContentProvider(); //Invalidate for lazy if(!(contentProvider instanceof ILazyContentProvider) && (contentProvider instanceof IStructuredContentProvider)) { //Don't cache if the root is null but cache if it is not lazy. if(root != null){ virtualManager.cachedElements = ((IStructuredContentProvider) getContentProvider()).getElements(root); getTable().setItemCount(virtualManager.cachedElements.length); } } getTable().clearAll(); } /** * Refresh all of the elements of the table. update the * labels if updatLabels is true; * @param updateLabels * * @since 3.1 */ private void internalRefreshAll(boolean updateLabels) { // the parent // in the code below, it is important to do all disassociates // before any associates, since a later disassociate can undo an
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -