Java tutorial
/******************************************************************************* * Copyright (c) 2012 Daniel Murygin. * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. * If not, see <http://www.gnu.org/licenses/>. * * Contributors: * Daniel Murygin <dm[at]sernet[dot]de> - initial API and implementation ******************************************************************************/ package sernet.verinice.rcp; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import sernet.gs.ui.rcp.main.Activator; import sernet.gs.ui.rcp.main.ExceptionUtil; import sernet.gs.ui.rcp.main.ImageCache; import sernet.gs.ui.rcp.main.bsi.dialogs.CnaTreeElementTitleFilter; import sernet.gs.ui.rcp.main.bsi.dialogs.Messages; import sernet.gs.ui.rcp.main.bsi.views.CnAImageProvider; import sernet.gs.ui.rcp.main.common.model.PlaceHolder; import sernet.gs.ui.rcp.main.service.ServiceFactory; import sernet.verinice.interfaces.CommandException; import sernet.verinice.model.common.CnATreeElement; import sernet.verinice.model.iso27k.IISO27kElement; import sernet.verinice.service.commands.LoadElementTitles; import sernet.verinice.service.commands.LoadCnAElementByEntityTypeId; /** * * * @author Daniel Murygin <dm[at]sernet[dot]de> */ public class ElementSelectionComponent { private transient Logger log = Logger.getLogger(ElementSelectionComponent.class); private Composite container; private TableViewer viewer; private Text text; private Button checkbox; private CnaTreeElementTitleFilter filter; private List<CnATreeElement> elementList; private Integer scopeId; private Integer groupId; private String typeId; private boolean scopeOnly; private boolean showScopeCheckbox; private static final String COLUMN_IMG = "_img"; //$NON-NLS-1$ private static final String COLUMN_SCOPE_ID = "_scope_id"; //$NON-NLS-1$ private static final String COLUMN_LABEL = "_label"; //$NON-NLS-1$ private static Map<Integer, String> titleMap = new HashMap<Integer, String>(); private List<CnATreeElement> selectedElements = new ArrayList<CnATreeElement>(); private Integer height; public ElementSelectionComponent(Composite container, String type, Integer scopeId) { this(container, type, scopeId, null); } public ElementSelectionComponent(Composite container, String type, Integer scopeId, Integer groupId) { super(); this.container = container; this.typeId = type; this.scopeId = scopeId; this.groupId = groupId; scopeOnly = true; showScopeCheckbox = true; } public void init() { final int formAttachmentDefaultOffset = 5; final int column1Width = 25; final int column2Width = 200; final int column3Width = 150; final int formData2Numerator = 100; final int formData3Numerator = formData2Numerator; container.setLayout(new FormLayout()); Label label1 = new Label(container, SWT.NULL); label1.setText(Messages.CnATreeElementSelectionDialog_3); FormData formData = new FormData(); formData.top = new FormAttachment(0, formAttachmentDefaultOffset); formData.left = new FormAttachment(0, formAttachmentDefaultOffset); label1.setLayoutData(formData); label1.pack(); text = new Text(container, SWT.BORDER); FormData formData2 = new FormData(); formData2.top = new FormAttachment(0, formAttachmentDefaultOffset); formData2.left = new FormAttachment(label1, formAttachmentDefaultOffset); formData2.right = new FormAttachment(formData2Numerator, (-1) * formAttachmentDefaultOffset); text.setLayoutData(formData2); text.addKeyListener(new KeyListener() { @Override public void keyReleased(KeyEvent e) { filter.setPattern(text.getText()); } @Override public void keyPressed(KeyEvent e) { } }); if (isShowScopeCheckbox()) { SelectionListener listener = new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { Button button = (e.getSource() instanceof Button) ? (Button) e.getSource() : null; if (button != null) { scopeOnly = button.getSelection(); loadElements(); } } @Override public void widgetDefaultSelected(SelectionEvent e) { } }; checkbox = SWTElementFactory.generateCheckboxButton(container, Messages.CnATreeElementSelectionDialog_4, true, listener); FormData checkboxFD = new FormData(); checkboxFD.top = new FormAttachment(text, formAttachmentDefaultOffset); checkboxFD.left = new FormAttachment(0, formAttachmentDefaultOffset); checkbox.setLayoutData(checkboxFD); checkbox.pack(); } viewer = new TableViewer(container, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI); FormData formData3 = new FormData(); if (isShowScopeCheckbox()) { formData3.top = new FormAttachment(checkbox, formAttachmentDefaultOffset); } else { formData3.top = new FormAttachment(text, formAttachmentDefaultOffset); } formData3.left = new FormAttachment(0, formAttachmentDefaultOffset); formData3.right = new FormAttachment(formData3Numerator, (-1) * formAttachmentDefaultOffset); formData3.bottom = new FormAttachment(formData3Numerator, (-1) * formAttachmentDefaultOffset); if (getHeight() != null) { formData3.height = getHeight(); } viewer.getTable().setLayoutData(formData3); viewer.getTable().setHeaderVisible(false); viewer.getTable().setLinesVisible(true); // image column: TableViewerColumn column1 = new TableViewerColumn(viewer, SWT.LEFT); column1.getColumn().setText(""); //$NON-NLS-1$ column1.getColumn().setWidth(column1Width); column1.getColumn().setResizable(false); column1.setLabelProvider(new CellLabelProvider() { @Override public void update(ViewerCell cell) { if (cell.getElement() instanceof PlaceHolder) { return; } CnATreeElement element = (CnATreeElement) cell.getElement(); Image image = CnAImageProvider.getCustomImage(element); if (image == null) { image = ImageCache.getInstance().getObjectTypeImage(element.getTypeId()); } cell.setImage(image); } }); // label column TableViewerColumn column2 = new TableViewerColumn(viewer, SWT.LEFT); column2.getColumn().setWidth(column2Width); column2.setLabelProvider(new CellLabelProvider() { @Override public void update(ViewerCell cell) { if (cell.getElement() instanceof PlaceHolder) { cell.setText(((PlaceHolder) cell.getElement()).getTitle()); return; } cell.setText(makeTitle((CnATreeElement) cell.getElement())); } }); // scope id column: TableViewerColumn column3 = new TableViewerColumn(viewer, SWT.LEFT); column3.getColumn().setWidth(column3Width); column3.setLabelProvider(new CellLabelProvider() { @Override public void update(ViewerCell cell) { if (cell.getElement() instanceof PlaceHolder) { cell.setText(((PlaceHolder) cell.getElement()).getTitle()); return; } String title = ""; CnATreeElement elmt = (CnATreeElement) cell.getElement(); try { if (!titleMap.containsKey(elmt.getScopeId())) { title = loadElementsTitles(elmt); } else { title = titleMap.get(elmt.getScopeId()); } } catch (CommandException e) { log.error("Error while getting element", e); } cell.setText(title); } }); viewer.setColumnProperties(new String[] { COLUMN_IMG, COLUMN_SCOPE_ID, COLUMN_LABEL }); viewer.setContentProvider(new ArrayContentProvider()); filter = new CnaTreeElementTitleFilter(viewer); viewer.setSorter(new ViewerSorter() { @Override public int compare(Viewer viewer, Object e1, Object e2) { String title1 = ""; String title2 = ""; CnATreeElement elmt1 = (CnATreeElement) e1; CnATreeElement elmt2 = (CnATreeElement) e2; if (titleMap != null) { title1 = titleMap.get(elmt1.getScopeId()); title2 = titleMap.get(elmt2.getScopeId()); if (title1 != null && title2 != null) { int allScopeTitles = title1.compareTo(title2); if (allScopeTitles == 0) { return makeTitle(elmt1).compareTo(makeTitle(elmt2)); } return title1.compareTo(title2); } else { if (title1 == null && title2 == null) { return makeTitle(elmt1).compareTo(makeTitle(elmt2)); } if (title1 == null) { return 1; } if (title2 == null) { return -1; } } } return makeTitle(elmt1).compareTo(makeTitle(elmt2)); } }); viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { selectedElements = ((IStructuredSelection) viewer.getSelection()).toList(); } }); viewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { selectedElements = ((IStructuredSelection) viewer.getSelection()).toList(); } }); } public void loadElements() { loadElementsAndSelect(null); } @SuppressWarnings("unchecked") public void loadElementsAndSelect(final CnATreeElement selected) { if (typeId == null || typeId.length() == 0) { return; } ArrayList temp = new ArrayList(1); temp.add(new PlaceHolder(Messages.CnATreeElementSelectionDialog_6)); viewer.setInput(temp); WorkspaceJob job = new WorkspaceJob(Messages.CnATreeElementSelectionDialog_7) { @Override public IStatus runInWorkspace(final IProgressMonitor monitor) { Activator.inheritVeriniceContextState(); try { monitor.setTaskName(Messages.CnATreeElementSelectionDialog_8); loadElementsFromDb(); setSelectedElement(selected); } catch (Exception e) { ExceptionUtil.log(e, Messages.CnATreeElementSelectionDialog_0); } return Status.OK_STATUS; } }; job.setUser(false); job.schedule(); } /** * */ protected void setSelection() { if (selectedElements != null && !selectedElements.isEmpty()) { getViewer().setSelection(new StructuredSelection(selectedElements)); } } private String makeTitle(CnATreeElement elmt) { StringBuilder sb = new StringBuilder(); if (elmt instanceof IISO27kElement) { String abbreviation = ((IISO27kElement) elmt).getAbbreviation(); if (abbreviation != null && !abbreviation.isEmpty()) { sb.append(abbreviation).append(" "); } } sb.append(elmt.getTitle()); return sb.toString(); } public List<CnATreeElement> getSelectedElements() { return selectedElements; } public Composite getContainer() { return container; } public TableViewer getViewer() { return viewer; } public boolean isScopeOnly() { return scopeOnly; } public void setScopeOnly(boolean scopeOnly) { this.scopeOnly = scopeOnly; if (this.checkbox != null) { this.checkbox.setSelection(scopeOnly); } } public boolean isShowScopeCheckbox() { return showScopeCheckbox; } public void setShowScopeCheckbox(boolean showScopeCheckbox) { this.showScopeCheckbox = showScopeCheckbox; } private void loadElementsFromDb() throws CommandException { LoadCnAElementByEntityTypeId command; if (scopeOnly) { command = new LoadCnAElementByEntityTypeId(typeId, getScopeId(), getGroupId()); } else { command = new LoadCnAElementByEntityTypeId(typeId); } command = ServiceFactory.lookupCommandService().executeCommand(command); showElementsInTable(command.getElements()); } private void showElementsInTable(final List<CnATreeElement> list) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { if (list != null) { viewer.setInput(list); } else { ArrayList temp = new ArrayList(0); viewer.setInput(temp); } } }); elementList = list; } public void deselectElements() { Display.getDefault().syncExec(new Runnable() { @Override public void run() { getViewer().getTable().deselectAll(); getViewer().setSelection(new StructuredSelection()); selectedElements.clear(); } }); } public void setSelectedElement(final CnATreeElement selectedElement) { if (selectedElement != null) { int i = elementList.indexOf(selectedElement); if (i != -1) { Display.getDefault().syncExec(new Runnable() { @Override public void run() { getViewer().getTable().deselectAll(); getViewer().setSelection(new StructuredSelection(selectedElement)); selectedElements = ((IStructuredSelection) viewer.getSelection()).toList(); } }); } } } private String loadElementsTitles(CnATreeElement elmt) throws CommandException { LoadElementTitles scopeCommand; scopeCommand = new LoadElementTitles(); scopeCommand = ServiceFactory.lookupCommandService().executeCommand(scopeCommand); titleMap = scopeCommand.getElements(); return titleMap.get(elmt.getScopeId()); } public Integer getScopeId() { return scopeId; } public void setScopeId(Integer scopeId) { this.scopeId = scopeId; } public Integer getGroupId() { return groupId; } public void setGroupId(Integer groupId) { this.groupId = groupId; } public String getTypeId() { return typeId; } public void setTypeId(String typeId) { this.typeId = typeId; } public Integer getHeight() { return height; } public void setHeight(Integer height) { this.height = height; } }