blob: 24dfb519fdc374d0f5e69746c435d3a2a802aecb [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.qpid.management.ui.views;
import static org.apache.qpid.management.ui.Constants.BUTTON_REFRESH;
import static org.apache.qpid.management.ui.Constants.FONT_BOLD;
import static org.apache.qpid.management.ui.Constants.FONT_ITALIC;
import static org.apache.qpid.management.ui.Constants.FONT_NORMAL;
import java.util.Collections;
import java.util.HashMap;
import org.apache.qpid.management.ui.ApplicationRegistry;
import org.apache.qpid.management.ui.ManagedBean;
import org.apache.qpid.management.ui.jmx.MBeanUtility;
import org.apache.qpid.management.ui.model.AttributeData;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* Abstract class to be extended by the Controller classes for different MBean types (Connection, Queue, Exchange)
*/
public abstract class MBeanTypeTabControl
{
private FormToolkit _toolkit = null;
private Form _form = null;
private TabFolder _tabFolder = null;
private Composite _composite = null;
private Composite _headerComposite = null;
private Composite _listComposite = null;
private Label _labelName = null;
private Label _labelDesc = null;
private Label _labelList = null;
private org.eclipse.swt.widgets.List _list = null;
private Button _refreshButton = null;
private Button _addButton = null;
private String _type = null;
// maps an mbean name with the mbean object. Required to get mbean object when an mbean
// is to be added to the navigation view.
private HashMap<String, ManagedBean> _objectsMap = new HashMap<String, ManagedBean>();
private Sorter _sorterByName = new Sorter();
public MBeanTypeTabControl(TabFolder tabFolder, String type)
{
_type = type;
_tabFolder = tabFolder;
_toolkit = new FormToolkit(_tabFolder.getDisplay());
_form = _toolkit.createForm(_tabFolder);
createFormComposite();
}
public FormToolkit getToolkit()
{
return _toolkit;
}
public Control getControl()
{
return _form;
}
public String getType()
{
return _type;
}
protected List getListWidget()
{
return _list;
}
protected HashMap<String, ManagedBean> getMBeansMap()
{
return _objectsMap;
}
public Sorter getMBeanNameSorter()
{
return _sorterByName;
}
public Button getAddButton()
{
return _addButton;
}
public Button getRefreshButton()
{
return _refreshButton;
}
/**
* Creates the main Composite, which will contain all other Composites and Widgets
*/
protected void createFormComposite()
{
_form.getBody().setLayout(new GridLayout());
_composite = _toolkit.createComposite(_form.getBody(), SWT.NONE);
_composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
GridLayout layout = new GridLayout();
layout.verticalSpacing = 10;
layout.horizontalSpacing = 0;
_composite.setLayout(layout);
}
protected Composite getFormComposite()
{
return _composite;
}
/**
* Creates the header composite, which has MBean type name and description
* @param parentComposite
*/
protected void createHeaderComposite(Composite parentComposite)
{
_headerComposite = _toolkit.createComposite(parentComposite);
_headerComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
GridLayout layout = new GridLayout();
layout.verticalSpacing = 10;
layout.horizontalSpacing = 0;
_headerComposite.setLayout(layout);
_labelName = _toolkit.createLabel(_headerComposite, "Type:", SWT.NONE);
GridData gridData = new GridData(SWT.CENTER, SWT.TOP, true, false);
_labelName.setLayoutData(gridData);
_labelName.setFont(ApplicationRegistry.getFont(FONT_BOLD));
_labelDesc = _toolkit.createLabel(_headerComposite, " ", SWT.NONE);
_labelDesc.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));
_labelDesc.setFont(ApplicationRegistry.getFont(FONT_ITALIC));
_headerComposite.layout();
}
/**
* Creates Composite, which contains the common buttons - Add and Refresh.
* @param parentComposite
*/
protected void createButtonsComposite(Composite parentComposite)
{
Composite composite = _toolkit.createComposite(parentComposite);
composite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
GridLayout layout = new GridLayout(2, true);
layout.verticalSpacing = 10;
layout.horizontalSpacing = 20;
composite.setLayout(layout);
createAddButton(composite);
createRefreshButton(composite);
}
/**
* Creates the Add button, which adds the selected item to the navigation view
* @param parentComposite
*/
protected void createAddButton(Composite parentComposite)
{
Button _addButton = _toolkit.createButton(parentComposite, "<- Add to Navigation", SWT.PUSH);
GridData gridData = new GridData(SWT.CENTER, SWT.CENTER, false, false);
_addButton.setLayoutData(gridData);
_addButton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e)
{
if (_list.getSelectionCount() == 0)
return;
String[] selectedItems = _list.getSelection();
for (int i = 0; i < selectedItems.length; i++)
{
String name = selectedItems[i];
// pass the ManagedBean to the navigation view to be added
ManagedBean mbean = _objectsMap.get(name);
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
NavigationView view = (NavigationView)window.getActivePage().findView(NavigationView.ID);
try
{
view.addManagedBean(mbean);
}
catch (Exception ex)
{
MBeanUtility.handleException(mbean, ex);
}
}
}
});
}
/**
* Creates the Refresh button, which gets syncs the items with the broker server
* @param parentComposite
*/
protected void createRefreshButton(Composite parentComposite)
{
Button _refreshButton = _toolkit.createButton(parentComposite, BUTTON_REFRESH, SWT.PUSH);
GridData gridData = new GridData(SWT.CENTER, SWT.CENTER, false, false);
gridData.widthHint = 120;
_refreshButton.setLayoutData(gridData);
_refreshButton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e)
{
try
{
// refresh the list from the broker server
populateList();
}
catch (Exception ex)
{
MBeanUtility.handleException(ex);
}
}
});
}
/**
* Creates the Composite, which contains the items ( Connections, Exchanges or Queues)
* @param parentComposite
*/
protected void createListComposite(Composite parentComposite)
{
// Composite to contain the item list
_listComposite = _toolkit.createComposite(parentComposite);
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
_listComposite.setLayoutData(gridData);
GridLayout layout = new GridLayout();
layout.verticalSpacing = 0;
_listComposite.setLayout(layout);
// Label for item name
_labelList = _toolkit.createLabel(_listComposite, " ", SWT.CENTER);
gridData = new GridData(SWT.CENTER, SWT.TOP, true, false, 1, 1);
_labelList.setLayoutData(gridData);
_labelList.setFont(ApplicationRegistry.getFont(FONT_NORMAL));
_list = new List(_listComposite, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
gridData = new GridData(SWT.FILL, SWT.FILL, true, true,1, 1);
_list.setLayoutData(gridData);
}
/**
* This is called from MBean View to refresh the tab contents
* @throws Exception
*/
public void refresh() throws Exception
{
setLabelValues();
populateList();
layout();
}
protected void setLabelValues()
{
_labelName.setText("Type : " + _type);
_labelDesc.setText("Select the " + _type + "(s) to add in the Navigation View");
_labelList.setText("-- List of " + _type + "s --");
}
protected abstract void populateList() throws Exception;
public void layout()
{
_form.layout(true);
_form.getBody().layout(true, true);
}
// sets the map with appropriate mbean and name
protected String[] getItems(java.util.List<ManagedBean> list)
{
if (list == null)
return new String[0];
Collections.sort(list, _sorterByName);
String[] items = new String[list.size()];
int i = 0;
for (ManagedBean mbean : list)
{
items[i++] = mbean.getName();
_objectsMap.put(mbean.getName(), mbean);
}
return items;
}
protected class ComparatorImpl implements java.util.Comparator<AttributeData>
{
public int compare(AttributeData data1, AttributeData data2)
{
Integer int1 = Integer.parseInt(data1.getValue().toString());
Integer int2 = Integer.parseInt(data2.getValue().toString());
return int1.compareTo(int2) * -1;
}
}
protected class Sorter implements java.util.Comparator<ManagedBean>
{
public int compare(ManagedBean mbean1, ManagedBean mbean2)
{
return mbean1.getName().compareTo(mbean2.getName());
}
}
}