Merge remote-tracking branch 'github/master' into dev

# Conflicts:
#	pom.xml
This commit is contained in:
rememberber 2024-01-17 09:32:03 +08:00
commit 53aca54f34
6 changed files with 727 additions and 235 deletions

329
.editorconfig Normal file
View File

@ -0,0 +1,329 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = false
max_line_length = 140
tab_width = 2
ij_continuation_indent_size = 2
ij_any_else_on_new_line = true
ij_any_catch_on_new_line = true
ij_any_finally_on_new_line = true
ij_any_block_comment_at_first_column = false
ij_any_line_comment_at_first_column = false
ij_javascript_force_semicolon_style = true
ij_javascript_use_semicolon_after_statement = false
# ij_formatter_off_tag = @formatter:off
# ij_formatter_on_tag = @formatter:on
# ij_formatter_tags_enabled = true
# ij_smart_tabs = false
# ij_visual_guides =
# ij_wrap_on_typing = false
[*.java]
# ij_java_align_consecutive_assignments = false
# ij_java_align_consecutive_variable_declarations = false
# ij_java_align_group_field_declarations = false
# ij_java_align_multiline_annotation_parameters = false
# ij_java_align_multiline_array_initializer_expression = false
# ij_java_align_multiline_assignment = false
# ij_java_align_multiline_binary_operation = false
# ij_java_align_multiline_chained_methods = false
# ij_java_align_multiline_deconstruction_list_components = true
# ij_java_align_multiline_extends_list = false
# ij_java_align_multiline_for = true
# ij_java_align_multiline_method_parentheses = false
# ij_java_align_multiline_parameters = true
# ij_java_align_multiline_parameters_in_calls = false
# ij_java_align_multiline_parenthesized_expression = false
# ij_java_align_multiline_records = true
# ij_java_align_multiline_resources = true
# ij_java_align_multiline_ternary_operation = false
# ij_java_align_multiline_text_blocks = false
# ij_java_align_multiline_throws_list = false
# ij_java_align_subsequent_simple_methods = false
# ij_java_align_throws_keyword = false
# ij_java_align_types_in_multi_catch = true
# ij_java_annotation_parameter_wrap = off
# ij_java_array_initializer_new_line_after_left_brace = false
# ij_java_array_initializer_right_brace_on_new_line = false
# ij_java_array_initializer_wrap = off
# ij_java_assert_statement_colon_on_next_line = false
# ij_java_assert_statement_wrap = off
# ij_java_assignment_wrap = off
# ij_java_binary_operation_sign_on_next_line = false
# ij_java_binary_operation_wrap = off
# ij_java_blank_lines_after_anonymous_class_header = 0
# ij_java_blank_lines_after_class_header = 0
# ij_java_blank_lines_after_imports = 1
# ij_java_blank_lines_after_package = 1
# ij_java_blank_lines_around_class = 1
# ij_java_blank_lines_around_field = 0
# ij_java_blank_lines_around_field_in_interface = 0
# ij_java_blank_lines_around_initializer = 1
# ij_java_blank_lines_around_method = 1
# ij_java_blank_lines_around_method_in_interface = 1
# ij_java_blank_lines_before_class_end = 0
# ij_java_blank_lines_before_imports = 1
# ij_java_blank_lines_before_method_body = 0
# ij_java_blank_lines_before_package = 0
# ij_java_block_brace_style = end_of_line
# ij_java_block_comment_add_space = false
# ij_java_block_comment_at_first_column = true
# ij_java_builder_methods =
# ij_java_call_parameters_new_line_after_left_paren = false
# ij_java_call_parameters_right_paren_on_new_line = false
# ij_java_call_parameters_wrap = off
# ij_java_case_statement_on_separate_line = true
# ij_java_catch_on_new_line = false
# ij_java_class_annotation_wrap = split_into_lines
# ij_java_class_brace_style = end_of_line
# ij_java_class_count_to_use_import_on_demand = 5
# ij_java_class_names_in_javadoc = 1
# ij_java_deconstruction_list_wrap = normal
# ij_java_do_not_indent_top_level_class_members = false
# ij_java_do_not_wrap_after_single_annotation = false
# ij_java_do_not_wrap_after_single_annotation_in_parameter = false
# ij_java_do_while_brace_force = never
# ij_java_doc_add_blank_line_after_description = true
# ij_java_doc_add_blank_line_after_param_comments = false
# ij_java_doc_add_blank_line_after_return = false
# ij_java_doc_add_p_tag_on_empty_lines = true
# ij_java_doc_align_exception_comments = true
# ij_java_doc_align_param_comments = true
# ij_java_doc_do_not_wrap_if_one_line = false
# ij_java_doc_enable_formatting = true
# ij_java_doc_enable_leading_asterisks = true
# ij_java_doc_indent_on_continuation = false
# ij_java_doc_keep_empty_lines = true
# ij_java_doc_keep_empty_parameter_tag = true
# ij_java_doc_keep_empty_return_tag = true
# ij_java_doc_keep_empty_throws_tag = true
# ij_java_doc_keep_invalid_tags = true
# ij_java_doc_param_description_on_new_line = false
# ij_java_doc_preserve_line_breaks = false
# ij_java_doc_use_throws_not_exception_tag = true
# ij_java_else_on_new_line = false
# ij_java_enum_constants_wrap = off
# ij_java_extends_keyword_wrap = off
# ij_java_extends_list_wrap = off
# ij_java_field_annotation_wrap = split_into_lines
# ij_java_field_name_prefix =
# ij_java_field_name_suffix =
# ij_java_finally_on_new_line = false
# ij_java_for_brace_force = never
# ij_java_for_statement_new_line_after_left_paren = false
# ij_java_for_statement_right_paren_on_new_line = false
# ij_java_for_statement_wrap = off
# ij_java_generate_final_locals = false
# ij_java_generate_final_parameters = false
# ij_java_if_brace_force = never
# ij_java_imports_layout = *,|,javax.**,java.**,|,$*
# ij_java_indent_case_from_switch = true
# ij_java_insert_inner_class_imports = false
# ij_java_insert_override_annotation = true
# ij_java_keep_blank_lines_before_right_brace = 2
# ij_java_keep_blank_lines_between_package_declaration_and_header = 2
# ij_java_keep_blank_lines_in_code = 2
# ij_java_keep_blank_lines_in_declarations = 2
# ij_java_keep_builder_methods_indents = false
# ij_java_keep_control_statement_in_one_line = true
# ij_java_keep_first_column_comment = true
# ij_java_keep_indents_on_empty_lines = false
# ij_java_keep_line_breaks = true
# ij_java_keep_multiple_expressions_in_one_line = false
# ij_java_keep_simple_blocks_in_one_line = false
# ij_java_keep_simple_classes_in_one_line = false
# ij_java_keep_simple_lambdas_in_one_line = false
# ij_java_keep_simple_methods_in_one_line = false
# ij_java_label_indent_absolute = false
# ij_java_label_indent_size = 0
# ij_java_lambda_brace_style = end_of_line
# ij_java_layout_static_imports_separately = true
# ij_java_line_comment_add_space = false
# ij_java_line_comment_add_space_on_reformat = false
# ij_java_line_comment_at_first_column = true
# ij_java_local_variable_name_prefix =
# ij_java_local_variable_name_suffix =
# ij_java_method_annotation_wrap = split_into_lines
# ij_java_method_brace_style = end_of_line
# ij_java_method_call_chain_wrap = off
# ij_java_method_parameters_new_line_after_left_paren = false
# ij_java_method_parameters_right_paren_on_new_line = false
# ij_java_method_parameters_wrap = off
# ij_java_modifier_list_wrap = false
# ij_java_multi_catch_types_wrap = normal
# ij_java_names_count_to_use_import_on_demand = 3
# ij_java_new_line_after_lparen_in_annotation = false
# ij_java_new_line_after_lparen_in_deconstruction_pattern = true
# ij_java_new_line_after_lparen_in_record_header = false
# ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.*
# ij_java_parameter_annotation_wrap = off
# ij_java_parameter_name_prefix =
# ij_java_parameter_name_suffix =
# ij_java_parentheses_expression_new_line_after_left_paren = false
# ij_java_parentheses_expression_right_paren_on_new_line = false
# ij_java_place_assignment_sign_on_next_line = false
# ij_java_prefer_longer_names = true
# ij_java_prefer_parameters_wrap = false
# ij_java_record_components_wrap = normal
# ij_java_repeat_annotations =
# ij_java_repeat_synchronized = true
# ij_java_replace_instanceof_and_cast = false
# ij_java_replace_null_check = true
# ij_java_replace_sum_lambda_with_method_ref = true
# ij_java_resource_list_new_line_after_left_paren = false
# ij_java_resource_list_right_paren_on_new_line = false
# ij_java_resource_list_wrap = off
# ij_java_rparen_on_new_line_in_annotation = false
# ij_java_rparen_on_new_line_in_deconstruction_pattern = true
# ij_java_rparen_on_new_line_in_record_header = false
# ij_java_space_after_closing_angle_bracket_in_type_argument = false
# ij_java_space_after_colon = true
# ij_java_space_after_comma = true
# ij_java_space_after_comma_in_type_arguments = true
# ij_java_space_after_for_semicolon = true
# ij_java_space_after_quest = true
# ij_java_space_after_type_cast = true
# ij_java_space_before_annotation_array_initializer_left_brace = false
# ij_java_space_before_annotation_parameter_list = false
# ij_java_space_before_array_initializer_left_brace = false
# ij_java_space_before_catch_keyword = true
# ij_java_space_before_catch_left_brace = true
# ij_java_space_before_catch_parentheses = true
# ij_java_space_before_class_left_brace = true
# ij_java_space_before_colon = true
# ij_java_space_before_colon_in_foreach = true
# ij_java_space_before_comma = false
# ij_java_space_before_deconstruction_list = false
# ij_java_space_before_do_left_brace = true
# ij_java_space_before_else_keyword = true
# ij_java_space_before_else_left_brace = true
# ij_java_space_before_finally_keyword = true
# ij_java_space_before_finally_left_brace = true
# ij_java_space_before_for_left_brace = true
# ij_java_space_before_for_parentheses = true
# ij_java_space_before_for_semicolon = false
# ij_java_space_before_if_left_brace = true
# ij_java_space_before_if_parentheses = true
# ij_java_space_before_method_call_parentheses = false
# ij_java_space_before_method_left_brace = true
# ij_java_space_before_method_parentheses = false
# ij_java_space_before_opening_angle_bracket_in_type_parameter = false
# ij_java_space_before_quest = true
# ij_java_space_before_switch_left_brace = true
# ij_java_space_before_switch_parentheses = true
# ij_java_space_before_synchronized_left_brace = true
# ij_java_space_before_synchronized_parentheses = true
# ij_java_space_before_try_left_brace = true
# ij_java_space_before_try_parentheses = true
# ij_java_space_before_type_parameter_list = false
# ij_java_space_before_while_keyword = true
# ij_java_space_before_while_left_brace = true
# ij_java_space_before_while_parentheses = true
# ij_java_space_inside_one_line_enum_braces = false
# ij_java_space_within_empty_array_initializer_braces = false
# ij_java_space_within_empty_method_call_parentheses = false
# ij_java_space_within_empty_method_parentheses = false
# ij_java_spaces_around_additive_operators = true
# ij_java_spaces_around_annotation_eq = true
# ij_java_spaces_around_assignment_operators = true
# ij_java_spaces_around_bitwise_operators = true
# ij_java_spaces_around_equality_operators = true
# ij_java_spaces_around_lambda_arrow = true
# ij_java_spaces_around_logical_operators = true
# ij_java_spaces_around_method_ref_dbl_colon = false
# ij_java_spaces_around_multiplicative_operators = true
# ij_java_spaces_around_relational_operators = true
# ij_java_spaces_around_shift_operators = true
# ij_java_spaces_around_type_bounds_in_type_parameters = true
# ij_java_spaces_around_unary_operator = false
# ij_java_spaces_within_angle_brackets = false
# ij_java_spaces_within_annotation_parentheses = false
# ij_java_spaces_within_array_initializer_braces = false
# ij_java_spaces_within_braces = false
# ij_java_spaces_within_brackets = false
# ij_java_spaces_within_cast_parentheses = false
# ij_java_spaces_within_catch_parentheses = false
# ij_java_spaces_within_deconstruction_list = false
# ij_java_spaces_within_for_parentheses = false
# ij_java_spaces_within_if_parentheses = false
# ij_java_spaces_within_method_call_parentheses = false
# ij_java_spaces_within_method_parentheses = false
# ij_java_spaces_within_parentheses = false
# ij_java_spaces_within_record_header = false
# ij_java_spaces_within_switch_parentheses = false
# ij_java_spaces_within_synchronized_parentheses = false
# ij_java_spaces_within_try_parentheses = false
# ij_java_spaces_within_while_parentheses = false
# ij_java_special_else_if_treatment = true
# ij_java_static_field_name_prefix =
# ij_java_static_field_name_suffix =
# ij_java_subclass_name_prefix =
# ij_java_subclass_name_suffix = Impl
# ij_java_ternary_operation_signs_on_next_line = false
# ij_java_ternary_operation_wrap = off
# ij_java_test_name_prefix =
# ij_java_test_name_suffix = Test
# ij_java_throws_keyword_wrap = off
# ij_java_throws_list_wrap = off
# ij_java_use_external_annotations = false
# ij_java_use_fq_class_names = false
# ij_java_use_relative_indents = false
# ij_java_use_single_class_imports = true
# ij_java_variable_annotation_wrap = off
# ij_java_visibility = public
# ij_java_while_brace_force = never
# ij_java_while_on_new_line = false
# ij_java_wrap_comments = false
# ij_java_wrap_first_method_in_call_chain = false
# ij_java_wrap_long_lines = false
[.editorconfig]
# ij_editorconfig_align_group_field_declarations = false
# ij_editorconfig_space_after_colon = false
# ij_editorconfig_space_after_comma = true
# ij_editorconfig_space_before_colon = false
# ij_editorconfig_space_before_comma = false
# ij_editorconfig_spaces_around_assignment_operators = true
[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.jspx,*.pom,*.rng,*.tagx,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}]
# ij_xml_align_attributes = true
# ij_xml_align_text = false
# ij_xml_attribute_wrap = normal
# ij_xml_block_comment_add_space = false
# ij_xml_block_comment_at_first_column = true
# ij_xml_keep_blank_lines = 2
# ij_xml_keep_indents_on_empty_lines = false
# ij_xml_keep_line_breaks = true
# ij_xml_keep_line_breaks_in_text = true
# ij_xml_keep_whitespaces = false
# ij_xml_keep_whitespaces_around_cdata = preserve
# ij_xml_keep_whitespaces_inside_cdata = false
# ij_xml_line_comment_at_first_column = true
# ij_xml_space_after_tag_name = false
# ij_xml_space_around_equals_in_attribute = false
# ij_xml_space_inside_empty_tag = false
# ij_xml_text_wrap = normal
[{*.markdown,*.md}]
# ij_markdown_force_one_space_after_blockquote_symbol = true
# ij_markdown_force_one_space_after_header_symbol = true
# ij_markdown_force_one_space_after_list_bullet = true
# ij_markdown_force_one_space_between_words = true
# ij_markdown_format_tables = true
# ij_markdown_insert_quote_arrows_on_wrap = true
# ij_markdown_keep_indents_on_empty_lines = false
# ij_markdown_keep_line_breaks_inside_text_blocks = true
# ij_markdown_max_lines_around_block_elements = 1
# ij_markdown_max_lines_around_header = 1
# ij_markdown_max_lines_between_paragraphs = 1
# ij_markdown_min_lines_around_block_elements = 1
# ij_markdown_min_lines_around_header = 1
# ij_markdown_min_lines_between_paragraphs = 1
# ij_markdown_wrap_text_if_long = true
# ij_markdown_wrap_text_inside_blockquotes = true

26
.gitignore vendored Normal file
View File

@ -0,0 +1,26 @@
### Java template
# Compiled class file
*.class
target/*
# Log file
*.log
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
# IntelliJ project files
.idea
*.iml
out
gen

View File

@ -5,7 +5,9 @@ Visual implementation of OSHI, to view information about the system and hardware
Such as OS, processes, memory, CPU, disks, devices, sensors, etc. Such as OS, processes, memory, CPU, disks, devices, sensors, etc.
## Supported platforms ## Supported platforms
Windows • Linux • macOS ![Windows](https://img.shields.io/badge/Windows-0078D6?style=for-the-badge&logo=windows&logoColor=A8E4A0)
![Linux](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black)
![macOS](https://img.shields.io/badge/mac%20os-000000?style=for-the-badge&logo=macos&logoColor=black)
## Screenshot ## Screenshot
![Overview](screenshot/overview_mac.png) ![Overview](screenshot/overview_mac.png)

1
_config.yml Normal file
View File

@ -0,0 +1 @@
theme: jekyll-theme-cayman

62
pom.xml
View File

@ -15,23 +15,25 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>21</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<logback.version>1.4.5</logback.version> <logback.version>1.4.7</logback.version>
<forms_rt.version>7.0.3</forms_rt.version> <forms_rt.version>7.0.3</forms_rt.version>
<lombok.version>1.18.30</lombok.version> <lombok.version>1.18.30</lombok.version>
<junit-jupiter-api.version>5.9.1</junit-jupiter-api.version> <junit-jupiter-api.version>5.9.2</junit-jupiter-api.version>
<commons-lang3.version>3.12.0</commons-lang3.version> <commons-lang3.version>3.12.0</commons-lang3.version>
<guava.version>31.1-jre</guava.version> <guava.version>31.1-jre</guava.version>
<okhttp.version>4.10.0</okhttp.version> <okhttp.version>5.0.0-alpha.11</okhttp.version>
<flatlaf.version>3.2</flatlaf.version> <flatlaf.version>3.1.1</flatlaf.version>
<flatlaf-extras.version>3.2</flatlaf-extras.version> <flatlaf-extras.version>3.1.1</flatlaf-extras.version>
<flatlaf-intellij-themes.version>3.2</flatlaf-intellij-themes.version> <flatlaf-intellij-themes.version>3.1.1</flatlaf-intellij-themes.version>
<hutool-all.version>5.8.11</hutool-all.version> <hutool-all.version>5.8.18</hutool-all.version>
<fastjson.version>2.0.22</fastjson.version> <fastjson.version>2.0.32</fastjson.version>
<oshi-core.version>6.4.5</oshi-core.version> <oshi-core.version>6.4.4</oshi-core.version>
<jfreechart.version>1.5.3</jfreechart.version> <jfreechart.version>1.5.4</jfreechart.version>
<imaging.version>1.0-alpha3</imaging.version>
<xmlwise.version>1.2.11</xmlwise.version>
</properties> </properties>
<dependencies> <dependencies>
@ -127,6 +129,18 @@
<artifactId>jfreechart</artifactId> <artifactId>jfreechart</artifactId>
<version>${jfreechart.version}</version> <version>${jfreechart.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-imaging</artifactId>
<version>${imaging.version}</version>
</dependency>
<dependency>
<groupId>xmlwise</groupId>
<artifactId>xmlwise</artifactId>
<version>${xmlwise.version}</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
@ -185,19 +199,19 @@
<!-- &lt;!&ndash; <jdkPath>X:\\path\to\linux\jdk</jdkPath>&ndash;&gt;--> <!-- &lt;!&ndash; <jdkPath>X:\\path\to\linux\jdk</jdkPath>&ndash;&gt;-->
<!-- </configuration>--> <!-- </configuration>-->
<!-- </execution>--> <!-- </execution>-->
<!-- <execution>--> <!-- <execution>-->
<!-- <id>bundling-for-mac</id>--> <!-- <id>bundling-for-mac</id>-->
<!-- <phase>package</phase>--> <!-- <phase>package</phase>-->
<!-- <goals>--> <!-- <goals>-->
<!-- <goal>package</goal>--> <!-- <goal>package</goal>-->
<!-- </goals>--> <!-- </goals>-->
<!-- <configuration>--> <!-- <configuration>-->
<!-- <platform>mac</platform>--> <!-- <platform>mac</platform>-->
<!-- <createTarball>true</createTarball>--> <!-- <createTarball>true</createTarball>-->
<!-- <additionalModules>jdk.crypto.ec</additionalModules>--> <!-- <additionalModules>jdk.crypto.ec</additionalModules>-->
<!-- &lt;!&ndash; <jdkPath>X:\\path\to\mac\jdk</jdkPath>&ndash;&gt;--> <!-- &lt;!&ndash; <jdkPath>X:\\path\to\mac\jdk</jdkPath>&ndash;&gt;-->
<!-- </configuration>--> <!-- </configuration>-->
<!-- </execution>--> <!-- </execution>-->
</executions> </executions>
</plugin> </plugin>
</plugins> </plugins>

View File

@ -8,19 +8,28 @@ import com.intellij.uiDesigner.core.Spacer;
import com.luoboduner.moo.info.App; import com.luoboduner.moo.info.App;
import com.luoboduner.moo.info.ui.UiConsts; import com.luoboduner.moo.info.ui.UiConsts;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.imaging.formats.icns.IcnsImageParser;
import org.apache.commons.lang3.SystemUtils;
import org.jetbrains.annotations.NotNull;
import oshi.PlatformEnum; import oshi.PlatformEnum;
import oshi.SystemInfo; import oshi.SystemInfo;
import oshi.software.os.OSProcess; import oshi.software.os.OSProcess;
import oshi.software.os.OperatingSystem; import oshi.software.os.OperatingSystem;
import oshi.util.FormatUtil; import oshi.util.FormatUtil;
import xmlwise.Plist;
import javax.swing.Timer;
import javax.swing.*; import javax.swing.*;
import javax.swing.filechooser.FileSystemView;
import javax.swing.table.*; import javax.swing.table.*;
import java.awt.*; import java.awt.*;
import java.util.ArrayList; import java.awt.image.BufferedImage;
import java.util.HashMap; import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.*;
/** /**
* ProcessesForm * ProcessesForm
@ -30,11 +39,13 @@ import java.util.Map;
*/ */
@Getter @Getter
public class ProcessesForm { public class ProcessesForm {
private static final String[] COLUMNS = {"PID", "PPID", "Threads", "% CPU", "Cumulative", "VSZ", "RSS", "% Memory", private static final String[] COLUMNS = {"Icon", "PID", "PPID", "Threads", "% CPU", "Cumulative", "VSZ", "RSS", "% Memory",
"Process Name"}; "Process Name"};
private static final double[] COLUMN_WIDTH_PERCENT = {0.07, 0.07, 0.07, 0.07, 0.09, 0.1, 0.1, 0.08, 0.35}; private static final double[] COLUMN_WIDTH_PERCENT = {0.01, 0.07, 0.07, 0.07, 0.07, 0.09, 0.1, 0.1, 0.08, 0.35};
private transient static Map<Integer, OSProcess> priorSnapshotMap = new HashMap<>(); private final static Map<Integer, OSProcess> priorSnapshotMap = new HashMap<>();
private final static HashMap<String, Icon> iconCacheMap = new HashMap<>();
private static final Log logger = LogFactory.get(); private static final Log logger = LogFactory.get();
@ -101,10 +112,21 @@ public class ProcessesForm {
*/ */
private static void initInfo() { private static void initInfo() {
OperatingSystem os = App.si.getOperatingSystem(); OperatingSystem os = App.si.getOperatingSystem();
TableModel model = new DefaultTableModel(parseProcesses(os.getProcesses(null, null, 0), App.si), COLUMNS); TableModel model = new DefaultTableModel(parseProcesses(os.getProcesses(null, null, 0), App.si), COLUMNS) {
@Override
public Class<?> getColumnClass(int column) {
if (column == 0) {
return ImageIcon.class;
}
return Object.class;
}
};
JTable procTable = getInstance().getProcessTable(); JTable procTable = getInstance().getProcessTable();
procTable.setModel(model); procTable.setModel(model);
resizeColumns(procTable.getColumnModel()); resizeColumns(procTable.getColumnModel());
procTable.getColumnModel().getColumn(0).setMaxWidth(32);
procTable.getColumnModel().getColumn(0).setMinWidth(32);
procTable.setShowGrid(true); procTable.setShowGrid(true);
DefaultTableCellRenderer hr = (DefaultTableCellRenderer) procTable.getTableHeader() DefaultTableCellRenderer hr = (DefaultTableCellRenderer) procTable.getTableHeader()
@ -174,22 +196,23 @@ public class ProcessesForm {
// Matches order of COLUMNS field // Matches order of COLUMNS field
i--; i--;
int pid = p.getProcessID(); int pid = p.getProcessID();
procArr[i][0] = pid; procArr[i][0] = getProcessIcon(p.getPath());
procArr[i][1] = p.getParentProcessID(); procArr[i][1] = pid;
procArr[i][2] = p.getThreadCount(); procArr[i][2] = p.getParentProcessID();
procArr[i][3] = p.getThreadCount();
if (processesForm.perProc.isSelected()) { if (processesForm.perProc.isSelected()) {
procArr[i][3] = String.format("%.1f", procArr[i][4] = String.format("%.1f",
100d * p.getProcessCpuLoadBetweenTicks(priorSnapshotMap.get(pid)) / cpuCount); 100d * p.getProcessCpuLoadBetweenTicks(priorSnapshotMap.get(pid)) / cpuCount);
procArr[i][4] = String.format("%.1f", 100d * p.getProcessCpuLoadCumulative() / cpuCount); procArr[i][5] = String.format("%.1f", 100d * p.getProcessCpuLoadCumulative() / cpuCount);
} else { } else {
procArr[i][3] = String.format("%.1f", procArr[i][4] = String.format("%.1f",
100d * p.getProcessCpuLoadBetweenTicks(priorSnapshotMap.get(pid))); 100d * p.getProcessCpuLoadBetweenTicks(priorSnapshotMap.get(pid)));
procArr[i][4] = String.format("%.1f", 100d * p.getProcessCpuLoadCumulative()); procArr[i][5] = String.format("%.1f", 100d * p.getProcessCpuLoadCumulative());
} }
procArr[i][5] = FormatUtil.formatBytes(p.getVirtualSize()); procArr[i][6] = FormatUtil.formatBytes(p.getVirtualSize());
procArr[i][6] = FormatUtil.formatBytes(p.getResidentSetSize()); procArr[i][7] = FormatUtil.formatBytes(p.getResidentSetSize());
procArr[i][7] = String.format("%.1f", 100d * p.getResidentSetSize() / totalMem); procArr[i][8] = String.format("%.1f", 100d * p.getResidentSetSize() / totalMem);
procArr[i][8] = p.getName(); procArr[i][9] = p.getName();
} }
// Re-populate snapshot map // Re-populate snapshot map
priorSnapshotMap.clear(); priorSnapshotMap.clear();
@ -199,6 +222,103 @@ public class ProcessesForm {
return procArr; return procArr;
} }
/**
* Retrieves the executable's associated icon if available, or returns null.
*
* @param fullProcessPathName The full path of the executable process.
* @return The associated icon, or null if not found.
*/
private static Icon getProcessIcon(String fullProcessPathName) {
if (iconCacheMap.containsKey(fullProcessPathName)) {
return iconCacheMap.get(fullProcessPathName);
}
File file = new File(fullProcessPathName);
if (!file.exists()) {
// Alternatively, provide a default icon or return nul
return UIManager.getIcon("FileView.fileIcon");
}
try {
if (SystemUtils.IS_OS_WINDOWS) {
Icon icon = FileSystemView.getFileSystemView().getSystemIcon(file);
iconCacheMap.put(fullProcessPathName, icon);
return icon;
}
if (SystemUtils.IS_OS_LINUX) {
// investigate why getPath or getCommandLine is "" on kali
}
// macOS-specific icon retrieval
// maybe find a simpler solution
// Todo : fix various icons like VLC ...
if (SystemUtils.IS_OS_MAC && fullProcessPathName.contains("MacOS")) {
String iconPathSplit = fullProcessPathName.split("MacOS")[0];
String plistFilePath = iconPathSplit + "Info.plist";
File pListFile = getFileWithSpaceUri(plistFilePath);
if (pListFile.exists()) {
Map<String, Object> properties = Plist.load(plistFilePath);
String cFBundleIconFile = (String) properties.get("CFBundleIconFile");
String iconFilePath = iconPathSplit + "Resources/" + cFBundleIconFile;
// Ensure file path ends with ".icns"
if (!iconFilePath.endsWith(".icns")) {
iconFilePath += ".icns";
}
File iconFile = getFileWithSpaceUri(iconFilePath);
if (iconFile.canRead()) {
List<BufferedImage> iconImages = new IcnsImageParser().getAllBufferedImages(iconFile);
Optional<BufferedImage> resultImage = iconImages
.stream().parallel()
.filter(num -> num.getRaster().getHeight() == 32).findAny();
if (resultImage.isPresent()) {
BufferedImage bufferedImageR = resizeImage(resultImage.get(), 26, 26);
Icon icon = new ImageIcon(bufferedImageR);
iconCacheMap.put(fullProcessPathName, icon);
return icon;
}
}
}
}
} catch (Exception e) {
}
return UIManager.getIcon("FileView.fileIcon");
}
@NotNull
/**
* Workaround to open folders files with spaces
* @param filePath
* @return file
*/
private static File getFileWithSpaceUri(String filePath) throws URISyntaxException {
URI outputURI = new URI(("file:///" + filePath.replaceAll(" ", "%20")));
File outputFile = new File(outputURI);
return outputFile;
}
/**
* ResizeImage BufferedImage to given targetWidth targetHeight preserve transparency
*
* @param originalImage
* @param targetWidth
* @param targetHeight
* @return resizeImage
*/
public static BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) throws IOException {
BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB_PRE);
Graphics2D graphics2D = resizedImage.createGraphics();
graphics2D.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);
graphics2D.dispose();
return resizedImage;
}
/** /**
* Codes are copied from oshi and have some modifications. * Codes are copied from oshi and have some modifications.
* *