Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions scouter.client.build/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@
<module>../scouter.client.product</module>
</modules>
<properties>
<tycho-version>4.0.8</tycho-version>
<tycho-version>5.0.1</tycho-version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>eclipse-2024-03</id>
<layout>p2</layout>
<url>https://download.eclipse.org/releases/2024-03/</url>
</repository>
</repositories>
<repositories>
<repository>
<id>eclipse-2025-12</id>
<layout>p2</layout>
<url>https://download.eclipse.org/releases/2025-12/</url>
</repository>
</repositories>

<build>
<plugins>
Expand Down
9 changes: 7 additions & 2 deletions scouter.client.product/scouter.client.product
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
<vmArgs>-Xms128m
-Xmx1024m
-XX:+UseG1GC
-Dosgi.requiredJavaVersion=17
-Dosgi.requiredJavaVersion=21
</vmArgs>
<vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
</vmArgsMac>
Expand All @@ -52,11 +52,16 @@
</vm>

<plugins>
<plugin id="org.eclipse.equinox.launcher"/>
<plugin id="org.eclipse.equinox.launcher.cocoa.macosx.x86_64" fragment="true"/>
<plugin id="org.eclipse.equinox.launcher.cocoa.macosx.aarch64" fragment="true"/>
<plugin id="org.eclipse.equinox.launcher.gtk.linux.x86_64" fragment="true"/>
<plugin id="org.eclipse.equinox.launcher.win32.win32.x86_64" fragment="true"/>
</plugins>

<features>
<feature id="org.eclipse.rcp"/>
<feature id="org.eclipse.platform"/>
<feature id="org.eclipse.equinox.executable"/>
<feature id="scouter.client.feature"/>
<feature id="org.eclipse.emf.ecore"/>
<feature id="org.eclipse.emf.common"/>
Expand Down
2 changes: 1 addition & 1 deletion scouter.client/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Require-Bundle:
org.eclipse.swt,
org.eclipse.e4.core.commands,
org.eclipse.e4.ui.services
Bundle-RequiredExecutionEnvironment: JavaSE-17
Bundle-RequiredExecutionEnvironment: JavaSE-21
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .,
lib/scouter.common.jar,
Expand Down
4 changes: 2 additions & 2 deletions scouter.client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source>
<target>17</target>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
</plugins>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,22 @@
*/
package scouter.client;

import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.WorkbenchWindow;
import org.eclipse.ui.internal.registry.ActionSetRegistry;
import org.eclipse.ui.internal.registry.IActionSetDescriptor;
import scouter.Version;
import scouter.client.misc.UpdateCheckScheduler;
import scouter.client.notice.NoticeCheckScheduler;
Expand Down Expand Up @@ -65,7 +73,10 @@ public ActionBarAdvisor createActionBarAdvisor(

IWorkbenchWindowConfigurer configurer;

@SuppressWarnings("restriction")
public void preWindowOpen() {
removeUnwantedActionSets();

configurer = getWindowConfigurer();
configurer.setInitialSize(new Point(1440, 900));
configurer.setShowMenuBar(true);
Expand All @@ -79,8 +90,53 @@ public void preWindowOpen() {
configurer.setTitle("Version - "+Version.getClientFullVersion() + "(" + TimeZone.getDefault().getDisplayName() + ")");
}

@SuppressWarnings("restriction")
public void postWindowOpen() {
super.postWindowOpen();
removeUnwantedMenus();
}

@SuppressWarnings("restriction")
private void removeUnwantedMenus() {
IWorkbenchWindow window = getWindowConfigurer().getWindow();
if (window instanceof WorkbenchWindow) {
MenuManager menuManager = ((WorkbenchWindow) window).getMenuManager();
String[] idsToRemove = {
"org.eclipse.search.menu",
"org.eclipse.ui.run"
};
for (String id : idsToRemove) {
IContributionItem item = menuManager.find(id);
if (item != null) {
menuManager.remove(item);
}
}
// Also remove by label for any remaining items
for (IContributionItem item : menuManager.getItems()) {
if (item instanceof MenuManager) {
String label = ((MenuManager) item).getMenuText();
if (label != null && (label.equals("Search") || label.equals("Run")
|| label.equals("&Search") || label.equals("&Run"))) {
menuManager.remove(item);
}
}
}
menuManager.update(true);
}
}

@SuppressWarnings("restriction")
private void removeUnwantedActionSets() {
ActionSetRegistry reg = WorkbenchPlugin.getDefault().getActionSetRegistry();
IActionSetDescriptor[] actionSets = reg.getActionSets();
for (IActionSetDescriptor actionSet : actionSets) {
String id = actionSet.getId();
if (id.startsWith("org.eclipse.search") || id.startsWith("org.eclipse.ui.run")
|| id.startsWith("org.eclipse.debug") || id.startsWith("org.eclipse.ui.externaltools")) {
IExtension ext = actionSet.getConfigurationElement().getDeclaringExtension();
reg.removeExtension(ext, new Object[]{actionSet});
}
}
}

public void dispose() {
Expand Down
94 changes: 65 additions & 29 deletions scouter.client/src/scouter/client/popup/ManageGroupDialog.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2015 the original author or authors.
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* Licensed under the Apache License, Version 2.0 (the "License");
Expand Down Expand Up @@ -40,6 +40,7 @@
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;

import scouter.client.Images;
import scouter.client.group.GroupManager;
Expand All @@ -55,8 +56,9 @@ public class ManageGroupDialog {
String objType;
IManageGroup callback;

Set<Integer> noSelectedSet = new HashSet<Integer>();
Set<Integer> selectedSet = new HashSet<Integer>();
Set<Integer> noSelectedSet = new HashSet<>();
Set<Integer> selectedSet = new HashSet<>();
Set<Integer> currentAllSet = new HashSet<>();

public ManageGroupDialog(Display display, String groupName, String objType,
IManageGroup callback) {
Expand All @@ -78,16 +80,30 @@ public void show() {
title.setFont(new Font(null, "Arial", 10, SWT.BOLD));
title.setImage(Images.getObjectIcon(objType, true, 0));
title.setText(groupName + "(" + getDisplayObjtype(objType) + ")");


Composite searchComp = new Composite(dialog, SWT.NONE);
searchComp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
searchComp.setLayout(new GridLayout(2, false));

CLabel searchLabel = new CLabel(searchComp, SWT.NONE);
searchLabel.setText("Search:");
final Text searchText = new Text(searchComp, SWT.BORDER);
searchText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
searchText.setMessage("Enter keyword to filter...");

new CLabel(dialog, SWT.NONE);
new CLabel(dialog, SWT.NONE);

final Table allObjects = new Table(dialog, SWT.BORDER | SWT.MULTI);
gr = new GridData(SWT.FILL, SWT.FILL, true, true);
gr.widthHint = 250;
gr.heightHint = 300;
gr.widthHint = 375;
gr.heightHint = 450;
allObjects.setLayoutData(gr);

Composite centerComp = new Composite(dialog, SWT.NONE);
gr = new GridData(SWT.FILL, SWT.FILL, true, true);
gr.widthHint = 100;
gr.widthHint = 150;
centerComp.setLayoutData(gr);
centerComp.setLayout(new GridLayout(1, true));

Expand All @@ -103,8 +119,8 @@ public void show() {

final Table selectedObjects = new Table(dialog, SWT.BORDER | SWT.MULTI);
gr = new GridData(SWT.FILL, SWT.FILL, true, true);
gr.widthHint = 250;
gr.heightHint = 300;
gr.widthHint = 375;
gr.heightHint = 450;
selectedObjects.setLayoutData(gr);

addBtn.addListener(SWT.Selection, new Listener(){
Expand All @@ -115,14 +131,17 @@ public void handleEvent(Event event) {
}
for (int i = 0; i < items.length; i++) {
TableItem item = items[i];
int objHash = (Integer) item.getData();
currentAllSet.remove(objHash);
TableItem newItem = new TableItem(selectedObjects, SWT.NONE);
newItem.setData(item.getData());
newItem.setText(item.getText());
newItem.setImage(item.getImage());
allObjects.remove(allObjects.indexOf(item));
item.dispose();
}
sortTable(allObjects);
String filter = searchText.getText();
refreshTable(allObjects, currentAllSet, filter);
sortTable(selectedObjects);
}
});
Expand All @@ -135,15 +154,17 @@ public void handleEvent(Event event) {
}
for (int i = 0; i < items.length; i++) {
TableItem item = items[i];
int objHash = (Integer) item.getData();
currentAllSet.add(objHash);
TableItem newItem = new TableItem(allObjects, SWT.NONE);
newItem.setData(item.getData());
newItem.setText(item.getText());
newItem.setImage(item.getImage());
selectedObjects.remove(selectedObjects.indexOf(item));
item.dispose();
}
sortTable(allObjects);
sortTable(selectedObjects);
String filter = searchText.getText();
refreshTable(allObjects, currentAllSet, filter);
}
});

Expand All @@ -168,17 +189,16 @@ public void handleEvent(Event event) {
return;
}
TableItem[] selectedItems = selectedObjects.getItems();
List<Integer> addedObjHashs = new ArrayList<Integer>();
List<Integer> addedObjHashs = new ArrayList<>();
for (TableItem item : selectedItems) {
int objHash = (Integer) item.getData();
if (selectedSet.contains(objHash) == false) {
addedObjHashs.add(objHash);
}
}
TableItem[] noSelectedItems = allObjects.getItems();
List<Integer> removedObjHashs = new ArrayList<Integer>();
for (TableItem item : noSelectedItems) {
int objHash = (Integer) item.getData();

List<Integer> removedObjHashs = new ArrayList<>();
for (Integer objHash : currentAllSet) {
if (noSelectedSet.contains(objHash) == false) {
removedObjHashs.add(objHash);
}
Expand All @@ -200,21 +220,13 @@ public void handleEvent(Event event) {
selectedSet.add(objHash);
} else {
noSelectedSet.add(objHash);
currentAllSet.add(objHash);
}
}
}
}

for (Integer objHash : noSelectedSet) {
AgentObject agent = AgentModelThread.getInstance().getAgentObject(objHash);
if (agent == null) {
continue;
}
TableItem item = new TableItem(allObjects, SWT.NONE);
item.setData(objHash);
item.setText(agent.getObjName() + "(" + ServerManager.getInstance().getServer(agent.getServerId()).getName() + ")");
item.setImage(agent.isAlive() ? Images.active : Images.dead);
}

refreshTable(allObjects, currentAllSet, null);

for (Integer objHash : selectedSet) {
AgentObject agent = AgentModelThread.getInstance().getAgentObject(objHash);
Expand All @@ -226,9 +238,15 @@ public void handleEvent(Event event) {
item.setText(agent.getObjName() + "(" + ServerManager.getInstance().getServer(agent.getServerId()).getName() + ")");
item.setImage(agent.isAlive() ? Images.active : Images.dead);
}

sortTable(allObjects);

sortTable(selectedObjects);

searchText.addListener(SWT.Modify, new Listener(){
public void handleEvent(Event event) {
String filter = searchText.getText();
refreshTable(allObjects, currentAllSet, filter);
}
});

dialog.pack();
dialog.open();
Expand Down Expand Up @@ -256,6 +274,24 @@ public int[] toIntArray(List<Integer> list) {
return ret;
}

private void refreshTable(Table table, Set<Integer> objHashSet, String filter) {
table.removeAll();
for (Integer objHash : objHashSet) {
AgentObject agent = AgentModelThread.getInstance().getAgentObject(objHash);
if (agent == null) {
continue;
}
String displayText = agent.getObjName() + "(" + ServerManager.getInstance().getServer(agent.getServerId()).getName() + ")";
if (filter == null || filter.isEmpty() || displayText.toLowerCase().contains(filter.toLowerCase())) {
TableItem item = new TableItem(table, SWT.NONE);
item.setData(objHash);
item.setText(displayText);
item.setImage(agent.isAlive() ? Images.active : Images.dead);
}
}
sortTable(table);
}

private void sortTable(Table table) {
TableItem[] items = table.getItems();
Collator collator = Collator.getInstance(Locale.getDefault());
Expand Down
17 changes: 16 additions & 1 deletion scouter.client/src/scouter/client/xlog/ImageCache.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public synchronized Image getXPImage(int objHash, byte xtype) {
}

private Image createXPImage(RGB rgb) {
return createXPImage5(rgb);
return createXPImage6(rgb);
}

private Image createXPImage4(RGB rgb) {
Expand Down Expand Up @@ -98,6 +98,21 @@ private Image createXPImage5(RGB rgb) {
return xp;
}

private Image createXPImage6(RGB rgb) {
Image xp;
xp = new Image(null, 5, 5);
GC gcc = new GC(xp);
gcc.setBackground(new Color(null, rgb));
gcc.fillRectangle(0, 0, 5, 5);
gcc.setBackground(ColorUtil.getInstance().getColor("white"));
gcc.fillRectangle(1, 0, 1, 1);
gcc.fillRectangle(4, 1, 1, 1);
gcc.fillRectangle(0, 3, 1, 1);
gcc.fillRectangle(3, 4, 1, 1);
gcc.dispose();
return xp;
}

public synchronized Image getXPErrorImage(byte xtype) {
if (errorXpDot == null) {
errorXpDot = createXPImage(ColorUtil.getInstance().getColor("red").getRGB());
Expand Down