Java tutorial
/* * This file is part of the ZoRa project: http://www.photozora.org. * * ZoRa is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * ZoRa 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ZoRa; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * (c) 2009 Berthold Daum */ package com.bdaum.zoom.ui.internal.dialogs; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import com.bdaum.zoom.cat.model.asset.AssetImpl; import com.bdaum.zoom.core.QueryField; import com.bdaum.zoom.css.ZColumnLabelProvider; import com.bdaum.zoom.fileMonitor.internal.filefilter.FilterChain; import com.bdaum.zoom.ui.internal.ZViewerComparator; public class KeywordCollectDialog extends ZProgressDialog { private class CollectJob extends Job { public CollectJob() { super(Messages.KeywordCollectDialog_collecting); setPriority(Job.INTERACTIVE); setSystem(true); } @Override public boolean belongsTo(Object family) { return family == KeywordCollectDialog.this; } @Override protected IStatus run(IProgressMonitor monitor) { final Shell shell = getShell(); FilterChain keywordFilter = QueryField.getKeywordFilter(); candidates = new HashSet<String>(); final List<AssetImpl> set = dbManager.obtainObjects(AssetImpl.class); if (!shell.isDisposed()) shell.getDisplay().syncExec(() -> setMinMax(0, Math.max(1, set.size()))); int i = 0; for (AssetImpl asset : set) { String[] list = asset.getKeyword(); if (list != null) for (String kw : keywordFilter.filter(list)) { if (!keywords.contains(kw)) candidates.add(kw); else unused.remove(kw); } if (++i % 10 == 0) { if (!shell.isDisposed()) { final int p = i; shell.getDisplay().syncExec(() -> progressBar.setSelection(p)); } } if (monitor.isCanceled()) return Status.CANCEL_STATUS; } if (!shell.isDisposed()) { shell.getDisplay().syncExec(() -> { candLabel.setText(NLS.bind(Messages.KeywordCollectDialog_candidates_x, candidates.size())); unusedLabel.setText(NLS.bind(Messages.KeywordCollectDialog_unused_x, unused.size())); viewer1.setInput(candidates); viewer2.setInput(unused); setMessage(Messages.KeywordCollectDialog_please_select_keywords); validate(); progressBar.setVisible(false); shell.pack(); Point size = shell.getSize(); shell.setSize(size.x, Math.min(size.y, 700)); shell.layout(true, true); }); } return Status.OK_STATUS; } } private final Set<String> keywords; private CheckboxTableViewer viewer1; private String[] toAdd; private Set<String> candidates; private HashSet<String> unused; private CheckboxTableViewer viewer2; private String[] toRemove; private Label candLabel; private Label unusedLabel; public KeywordCollectDialog(Shell parentShell, Set<String> keywords) { super(parentShell); setShellStyle(getShellStyle() | SWT.RESIZE); this.keywords = keywords; this.unused = new HashSet<>(keywords); } @Override public void create() { super.create(); setTitle(Messages.KeywordCollectDialog_collected_keywords); setMessage(Messages.KeywordCollectDialog_collecting_keywords); BusyIndicator.showWhile(getShell().getDisplay(), () -> new CollectJob().schedule()); } private void validate() { String errorMessage = null; if (unused.isEmpty() && candidates.isEmpty()) errorMessage = Messages.KeywordCollectDialog_nothing_to_select_from; else if (viewer1.getCheckedElements().length == 0 && viewer2.getCheckedElements().length == 0) errorMessage = Messages.KeywordCollectDialog_nothing_selected; setErrorMessage(errorMessage); boolean enabled = errorMessage == null; getShell().setModified(enabled); getButton(IDialogConstants.OK_ID).setEnabled(enabled); } @SuppressWarnings("unused") @Override protected void createCustomArea(Composite area) { area.setLayout(new GridLayout(1, true)); Composite composite = new Composite(area, SWT.NONE); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); composite.setLayout(new GridLayout(2, true)); candLabel = new Label(composite, SWT.NONE); candLabel.setText(Messages.KeywordCollectDialog_candidates); unusedLabel = new Label(composite, SWT.NONE); unusedLabel.setText(Messages.KeywordCollectDialog_unused); Composite viewerComp1 = new Composite(composite, SWT.NONE); viewerComp1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); GridLayout layout = new GridLayout(2, false); layout.marginHeight = layout.marginWidth = 0; viewerComp1.setLayout(layout); viewer1 = CheckboxTableViewer.newCheckList(viewerComp1, SWT.BORDER | SWT.V_SCROLL); viewer1.getTable().setLayoutData(new GridData(500, 300)); viewer1.setContentProvider(ArrayContentProvider.getInstance()); viewer1.setLabelProvider(ZColumnLabelProvider.getDefaultInstance()); viewer1.setComparator(ZViewerComparator.INSTANCE); viewer1.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer1.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { validate(); } }); new AllNoneGroup(viewerComp1, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { viewer1.setAllChecked(e.widget.getData() == AllNoneGroup.ALL); validate(); } }); Composite viewerComp2 = new Composite(composite, SWT.NONE); viewerComp2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); layout = new GridLayout(2, false); layout.marginHeight = layout.marginWidth = 0; viewerComp2.setLayout(layout); viewer2 = CheckboxTableViewer.newCheckList(viewerComp2, SWT.BORDER | SWT.V_SCROLL); viewer2.getTable().setLayoutData(new GridData(500, 300)); viewer2.setContentProvider(ArrayContentProvider.getInstance()); viewer2.setLabelProvider(ZColumnLabelProvider.getDefaultInstance()); viewer2.setComparator(ZViewerComparator.INSTANCE); viewer2.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer2.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { validate(); } }); new AllNoneGroup(viewerComp2, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { viewer2.setAllChecked(e.widget.getData() == AllNoneGroup.ALL); validate(); } }); } @Override protected void buttonPressed(int buttonId) { Job.getJobManager().cancel(this); super.buttonPressed(buttonId); } @Override protected void okPressed() { toAdd = (String[]) viewer1.getCheckedElements(); toRemove = (String[]) viewer2.getCheckedElements(); super.okPressed(); } public String[] getToAdd() { return toAdd; } public String[] getToRemove() { return toRemove; } }