/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This 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 2.1 of * the License, or (at your option) any later version. * * This software 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 software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.hibernate.eclipse.console.views; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabFolder2Adapter; import org.eclipse.swt.custom.CTabFolderEvent; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IActionBars; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.views.properties.IPropertySheetPage; import org.eclipse.ui.views.properties.PropertySheetPage; import org.hibernate.console.KnownConfigurations; import org.hibernate.console.QueryPage; import org.hibernate.eclipse.console.views.properties.HibernatePropertySourceProvider; /** */ public class QueryPageTabView extends ViewPart implements ISelectionProvider { public static final String ID = "org.hibernate.eclipse.console.views.QueryPageTabView"; //$NON-NLS-1$ protected CTabFolder tabs = null; private Set<ISelectionChangedListener> listeners = Collections.synchronizedSet(new HashSet<ISelectionChangedListener>() ); protected List<QueryPageViewer> pageViewers = Collections.synchronizedList(new ArrayList<QueryPageViewer>() ); ListDataListener dataListener = new ListDataListener() { public void contentsChanged(ListDataEvent e) { rebuild(); } public void intervalAdded(ListDataEvent e) { try { getSite().getPage().showView(ID); } catch (PartInitException e1) { // ignore } contentsChanged(e); } public void intervalRemoved(ListDataEvent e) { contentsChanged(e); } }; private QueryPageTabViewActionGroup actionGroup; /** * Generic contructor */ public QueryPageTabView() { KnownConfigurations.getInstance().getQueryPageModel().addListDataListener(dataListener); } protected void rebuild() { QueryPage selection = getSelectedQueryPage(); for (QueryPage results : getAddedResultSets()) { this.pageViewers.add(new QueryPageViewer(this, results) ); } for (QueryPage results : getRemovedResultSets()) { QueryPageViewer viewer = findViewerFor(results); this.pageViewers.remove(viewer); viewer.dispose(); } // Handle firing selection changes here to cover for when the model fire changes // but the Tab widget doesn't (e.g. the first page). QueryPage newSelection = getSelectedQueryPage(); if (selection != null && newSelection == null) { fireSelectionChangedEvent(); } else if (selection == null && newSelection != null) { fireSelectionChangedEvent(); } else if (selection != null && !selection.equals(newSelection) ) { fireSelectionChangedEvent(); } } public void setFocus() { } public void dispose() { KnownConfigurations.getInstance().getQueryPageModel().removeListDataListener(dataListener); for (int i = 0; i < pageViewers.size(); i++) { pageViewers.get(i).dispose(); } super.dispose(); } public void createPartControl(Composite parent) { tabs = new CTabFolder(parent, SWT.CLOSE | SWT.BOTTOM); tabs.setSimple( false ); tabs.setUnselectedCloseVisible( false ); tabs.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { fireSelectionChangedEvent(); } }); tabs.addCTabFolder2Listener( new CTabFolder2Adapter() { public void close(CTabFolderEvent event) { QueryPage qp = (QueryPage) event.item.getData(); KnownConfigurations.getInstance().getQueryPageModel().remove( qp ); } }); rebuild(); initActions(); provideSelection(); } private void provideSelection() { getSite().setSelectionProvider(this); } public void initActions() { this.actionGroup = new QueryPageTabViewActionGroup(this,this); IActionBars actionBars = getViewSite().getActionBars(); this.actionGroup.fillActionBars(actionBars); } public void fireSelectionChangedEvent(ISelection selection) { for (ISelectionChangedListener listener : listeners) { listener.selectionChanged(new SelectionChangedEvent(this, selection) ); } } /** fire event that query-tab is changed **/ protected void fireSelectionChangedEvent() { ISelection selection = getSelection(); fireSelectionChangedEvent(selection); } @Override public <T> T getAdapter(Class<T> adapter) { if (adapter.equals(IPropertySheetPage.class) ) { PropertySheetPage page = new PropertySheetPage(); page.setPropertySourceProvider(new HibernatePropertySourceProvider(this) ); return adapter.cast(page); } return super.getAdapter(adapter); } public ISelection getSelection() { QueryPage selection = getSelectedQueryPage(); return selection == null ? new StructuredSelection() : new StructuredSelection(selection); } /** * @return */ public QueryPage getSelectedQueryPage() { QueryPageViewer viewer = getSelectedQueryPageViewer(); return viewer == null ? null : viewer.getQueryPage(); } protected QueryPageViewer getSelectedQueryPageViewer() { QueryPageViewer selection = null; if(this.tabs.isDisposed() ) { return selection; } else { int index = this.tabs.getSelectionIndex(); if (index >= 0) { CTabItem item = this.tabs.getItem(index); for (Iterator<QueryPageViewer> i = this.pageViewers.iterator(); selection == null && i.hasNext();) { QueryPageViewer viewer = i.next(); if (item == viewer.getTabItem() ) { selection = viewer; } } } } return selection; } /** * @return */ private Collection<QueryPage> getRemovedResultSets() { Collection<QueryPage> collection = KnownConfigurations.getInstance().getQueryPageModel().getPagesAsList(); Collection<QueryPage> visible = getQueryPages(); visible.removeAll(collection); return visible; } private Collection<QueryPage> getAddedResultSets() { Collection<QueryPage> collection = KnownConfigurations.getInstance().getQueryPageModel().getPagesAsList(); collection.removeAll(getQueryPages() ); return collection; } private Collection<QueryPage> getQueryPages() { List<QueryPage> list = new ArrayList<QueryPage>(); for (QueryPageViewer viewer : pageViewers) { list.add(viewer.getQueryPage() ); } return list; } private QueryPageViewer findViewerFor(QueryPage results) { QueryPageViewer viewer = null; for (QueryPageViewer temp : pageViewers) { if (results != null && results.equals(temp.getQueryPage() ) ) { viewer = temp; } } return viewer; } public void addSelectionChangedListener(ISelectionChangedListener listener) { this.listeners.add(listener); } public void removeSelectionChangedListener(ISelectionChangedListener listener) { this.listeners.remove(listener); } public void setSelection(ISelection selection) { } }