/******************************************************************************* * Copyright (c) 2008-2011, G. Weirich and Elexis * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * G. Weirich - initial implementation * *******************************************************************************/ package ch.elexis.core.ui.dialogs; import java.text.MessageFormat; import java.util.List; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.model.ISticker; import ch.elexis.core.ui.data.UiSticker; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.data.PersistentObject; import ch.elexis.data.Sticker; public class AssignStickerDialog extends TitleAreaDialog { PersistentObject mine; TableViewer viewer; StickerViewerComparator comparator; List<Sticker> alleEtiketten; List<ISticker> mineEtiketten; public AssignStickerDialog(Shell shell, PersistentObject obj){ super(shell); mine = obj; mineEtiketten = mine.getStickers(); alleEtiketten = Sticker.getStickersForClass(mine.getClass()); } @Override protected Control createDialogArea(Composite parent){ Composite ret = new Composite(parent, SWT.NONE); ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); ret.setLayout(new GridLayout()); Label lbl = new Label(ret, SWT.WRAP); lbl.setText(Messages.AssignStickerDialog_PleaseConfirm); //$NON-NLS-1$ viewer = new TableViewer(ret, SWT.CHECK | SWT.FULL_SELECTION); viewer.getTable().setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); viewer.getTable().setHeaderVisible(true); viewer.setContentProvider(ArrayContentProvider.getInstance()); viewer.setInput(alleEtiketten); createColumns(); comparator = new StickerViewerComparator(); viewer.setComparator(comparator); checkAlreadySelected(); return ret; } private void checkAlreadySelected(){ TableItem[] tableItems = viewer.getTable().getItems(); for (TableItem item : tableItems) { if (mineEtiketten.contains(item.getData())) { item.setChecked(true); } } } private void createColumns(){ // first column - label TableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE); col.getColumn().setText(Messages.AssignStickerDialog_StickerName); col.getColumn().setWidth(300); col.getColumn().addSelectionListener(getSelectionAdapter(col.getColumn(), 0)); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element){ Sticker s = (Sticker) element; return s.getLabel(); } @Override public Color getBackground(Object element){ Sticker s = (Sticker) element; UiSticker uiSticker = new UiSticker(s); return uiSticker.getBackground(); } @Override public Color getForeground(Object element){ Sticker s = (Sticker) element; UiSticker uiSticker = new UiSticker(s); return uiSticker.getForeground(); } }); // second column - value col = new TableViewerColumn(viewer, SWT.NONE); col.getColumn().setText(Messages.AssignStickerDialog_StickerWert); col.getColumn().setWidth(50); col.getColumn().addSelectionListener(getSelectionAdapter(col.getColumn(), 1)); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element){ Sticker s = (Sticker) element; return s.getWert() + ""; } @Override public Color getBackground(Object element){ Sticker s = (Sticker) element; UiSticker uiSticker = new UiSticker(s); return uiSticker.getBackground(); } @Override public Color getForeground(Object element){ Sticker s = (Sticker) element; UiSticker uiSticker = new UiSticker(s); return uiSticker.getForeground(); } }); } private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index){ SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e){ comparator.setColumn(index); viewer.getTable().setSortDirection(comparator.getDirection()); viewer.getTable().setSortColumn(column); viewer.refresh(); } }; return selectionAdapter; } @Override public void create(){ super.create(); setTitle("Sticker"); //$NON-NLS-1$ setMessage(MessageFormat .format(Messages.AssignStickerDialog_enterStickers, mine.getLabel())); //$NON-NLS-1$ getShell().setText("Elexis Sticker"); //$NON-NLS-1$ } @Override protected void okPressed(){ TableItem[] tableItems = viewer.getTable().getItems(); for (TableItem it : tableItems) { Sticker et = (Sticker) it.getData(); if (it.getChecked()) { if (!mineEtiketten.contains(et)) { mine.addSticker(et); } } else { if (mineEtiketten.contains(et)) { mine.removeSticker(et); } } } ElexisEventDispatcher.update(mine); super.okPressed(); } class StickerViewerComparator extends ViewerComparator { private int propertyIndex; private boolean direction = true; private Sticker s1; private Sticker s2; public StickerViewerComparator(){ this.propertyIndex = 0; } @Override public int compare(Viewer viewer, Object e1, Object e2){ if (e1 instanceof Sticker && e2 instanceof Sticker) { s1 = (Sticker) e1; s2 = (Sticker) e2; int rc = 0; switch (propertyIndex) { case 0: String label1 = s1.getLabel().toLowerCase(); String label2 = s2.getLabel().toLowerCase(); rc = label1.compareTo(label2); break; case 1: Integer wert1 = s1.getWert(); Integer wert2 = s2.getWert(); rc = wert1.compareTo(wert2); break; default: break; } // If descending order, flip the direction if (direction) { rc = -rc; } return rc; } return 0; } /** * for sort direction * * @return SWT.DOWN or SWT.UP */ public int getDirection(){ return direction ? SWT.DOWN : SWT.UP; } public void setColumn(int column){ if (column == this.propertyIndex) { // Same column as last sort; toggle the direction direction = !direction; } else { // New column; do an ascending sort this.propertyIndex = column; direction = true; } } } }