/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* Licensed 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 scouter.client.popup;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
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.graphics.Image;
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.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import scouter.client.Images;
import scouter.client.model.AgentModelThread;
import scouter.client.model.AgentObject;
import scouter.client.model.GroupObject;
import scouter.client.model.HierarchyObject;
import scouter.client.model.ServerObject;
import scouter.client.server.Server;
import scouter.client.server.ServerManager;
import scouter.client.threads.ObjectSelectManager;
import scouter.client.util.ColorUtil;
import scouter.client.util.UIUtil;
import scouter.lang.counters.CounterEngine;
public class ObjectSelectionDialog {
public CheckboxTreeViewer objTreeViewer;
private Map<String, ServerObject> root = new TreeMap<String, ServerObject>();
ObjectSelectManager objSelMgr = ObjectSelectManager.getInstance();
public void show() {
final Shell dialog = new Shell(Display.getDefault(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.RESIZE);
UIUtil.setDialogDefaultFunctions(dialog);
dialog.setText("Filter Object");
createPartControl(dialog);
makeTreeContents();
dialog.pack();
dialog.open();
}
Set<Integer> objHashSet = new HashSet<Integer>();
private void createPartControl(final Shell dialog) {
dialog.setLayout(new GridLayout(1, true));
Composite mainComposite = new Composite(dialog, SWT.NONE);
GridData gr = new GridData(SWT.FILL, SWT.FILL, true, true);
gr.widthHint = 500;
gr.heightHint = 400;
mainComposite.setLayoutData(gr);
objTreeViewer = new CheckboxTreeViewer(mainComposite, SWT.BORDER | SWT.VIRTUAL | SWT.H_SCROLL | SWT.V_SCROLL);
Tree objTree = objTreeViewer.getTree();
objTree.setHeaderVisible(true);
objTree.setLinesVisible(false);
TreeColumn column1 = new TreeColumn(objTree, SWT.LEFT);
column1.setAlignment(SWT.LEFT);
column1.setText("Type/Object");
TreeColumnLayout layout = new TreeColumnLayout();
mainComposite.setLayout( layout );
layout.setColumnData(column1, new ColumnWeightData(100));
objTreeViewer.setContentProvider(new ViewContentProvider());
objTreeViewer.setLabelProvider(new TableLabelProvider());
objTreeViewer.setCheckStateProvider(new TreeCheckStateProvider());
objTreeViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
objTreeViewer.setSubtreeChecked(event.getElement(), event.getChecked());
}
});
objTreeViewer.setInput(root);
Composite bottomComp = new Composite(dialog, SWT.NONE);
gr = new GridData(SWT.FILL, SWT.FILL, false, true);
bottomComp.setLayoutData(gr);
bottomComp.setLayout(UIUtil.formLayout(0, 0));
Button cancelBtn = new Button(bottomComp, SWT.PUSH);
cancelBtn.setLayoutData(UIUtil.formData(null, -1, 0, 5, 100, -5, null, -1, 100));
cancelBtn.setText("&Cancel");
cancelBtn.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
dialog.close();
}
});
Button okBtn = new Button(bottomComp, SWT.PUSH);
okBtn.setLayoutData(UIUtil.formData(null, -1, 0, 5, cancelBtn, -5, null, -1, 100));
okBtn.setText("&Apply");
okBtn.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Object[] checkedElements = objTreeViewer.getCheckedElements();
Set<Integer> checkdObjHashSet = new HashSet<Integer>();
for (Object o : checkedElements) {
if (o instanceof AgentObject) {
AgentObject a = (AgentObject) o;
checkdObjHashSet.add(a.getObjHash());
}
}
objHashSet.removeAll(checkdObjHashSet);
objSelMgr.addAll(objHashSet);
dialog.close();
}
});
}
private void makeTreeContents() {
Set<Integer> sIds = ServerManager.getInstance().getOpenServerList();
for (int serverId : sIds) {
String serverName = ServerManager.getInstance().getServer(serverId).getName();
ServerObject serverObj = new ServerObject(serverId, serverName);
root.put(serverName, serverObj);
}
AgentObject[] objectList = AgentModelThread.getInstance().getObjectList();
for (AgentObject agent : objectList) {
int serverId = agent.getServerId();
String serverName = ServerManager.getInstance().getServer(serverId).getName();
ServerObject serverObj = root.get(serverName);
if (serverObj == null) {
continue;
}
AgentObject obj = new AgentObject(agent);
objHashSet.add(obj.getObjHash());
HierarchyObject grpObj = serverObj.getChild(obj.getObjType());
CounterEngine engine = ServerManager.getInstance().getServer(serverId).getCounterEngine();
if (grpObj == null) {
grpObj = new GroupObject(obj.getObjType(), serverName + "/" + engine.getDisplayNameObjectType(obj.getObjType()));
serverObj.putChild(obj.getObjType(), grpObj);
grpObj.setParent(serverObj);
}
grpObj.putChild(obj.getObjName(), obj);
obj.setParent(grpObj);
}
objTreeViewer.refresh();
objTreeViewer.expandAll();
}
class ViewContentProvider implements ITreeContentProvider {
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
}
public void dispose() {
}
@SuppressWarnings("rawtypes")
public Object[] getElements(Object parent) {
if (parent instanceof Map) {
return ((Map) parent).values().toArray();
}
return new Object[0];
}
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof HierarchyObject){
return ((HierarchyObject) parentElement).getSortedChildArray();
}
return new Object[0];
}
public Object getParent(Object element) {
if (element instanceof HierarchyObject) {
return ((HierarchyObject) element).getParent();
}
return null;
}
public boolean hasChildren(Object element) {
if (element instanceof HierarchyObject){
return ((HierarchyObject) element).getChildSize() > 0;
}
return false;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return true;
}
}
class TableLabelProvider implements ITableLabelProvider, IColorProvider {
public Image getColumnImage(Object obj, int columnIndex) {
switch (columnIndex) {
case 0:
if (obj instanceof AgentObject) {
AgentObject a = (AgentObject) obj;
return a.isAlive() ? Images.active : Images.dead;
} else if (obj instanceof ServerObject) {
ServerObject a = (ServerObject) obj;
Server server = ServerManager.getInstance().getServer(a.getId());
boolean isConnected = server.isConnected();
if (ServerManager.getInstance().getDefaultServer() == server) {
if (isConnected) {
return Images.SERVER_DEFAULT_ACT;
} else {
return Images.SERVER_DEFAULT_INACT;
}
} else {
if (isConnected) {
return Images.SERVER_ACT;
} else {
return Images.SERVER_INACT;
}
}
} else if (obj instanceof GroupObject) {
GroupObject grpObj = (GroupObject) obj;
HierarchyObject parent = grpObj.getParent();
if (parent != null && parent instanceof ServerObject) {
return Images.getObjectIcon(grpObj.getObjType(), true, ((ServerObject)parent).getId());
} else {
return Images.getObjectIcon(grpObj.getObjType(), true, 0);
}
}
return Images.default_context;
}
return null;
}
public String getColumnText(Object obj, int columnIndex) {
switch (columnIndex) {
case 0:
if (obj instanceof AgentObject) {
AgentObject a = (AgentObject) obj;
String display = a.getObjName();
return display;
} else if (obj instanceof ServerObject) {
ServerObject a = (ServerObject) obj;
return a.getName();
} else if (obj instanceof GroupObject) {
GroupObject a = (GroupObject) obj;
String name = a.getName();
int index = name.indexOf("/");
if (index > -1) {
return name.substring(index + 1, name.length());
} else {
return name;
}
}
return obj.toString();
}
return null;
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
public Color getForeground(Object obj) {
if (obj instanceof AgentObject) {
AgentObject a = (AgentObject) obj;
if(!a.isAlive()){
return ColorUtil.getInstance().getColor("gray");
}
}
return null;
}
public Color getBackground(Object element) {
return null;
}
}
class TreeCheckStateProvider implements ICheckStateProvider {
public boolean isChecked(Object element) {
if (element instanceof AgentObject) {
return !objSelMgr.isUnselectedObject(((AgentObject) element).getObjHash());
}
return false;
}
public boolean isGrayed(Object element) {
if (element instanceof AgentObject)
return false;
return true;
}
}
}