2016-10-04 06:33:25 +02:00
/ *
* Copyright ( C ) 2015 Laurent CLOUET
* Author Laurent CLOUET < laurent . clouet @nopnop.net >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; version 2
* of the License .
*
* This program 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 General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
* /
2016-10-12 00:34:51 +02:00
2015-01-15 23:20:17 +01:00
package com.sheepit.client.standalone.swing.activity ;
2016-10-12 00:34:51 +02:00
import java.awt.Component ;
import java.awt.Container ;
2015-07-29 16:51:34 -06:00
import java.awt.GridBagConstraints ;
2016-10-12 00:34:51 +02:00
import java.awt.GridBagLayout ;
import java.awt.GridLayout ;
2015-01-15 23:20:17 +01:00
import java.awt.event.ActionEvent ;
import java.awt.event.ActionListener ;
import java.awt.image.BufferedImage ;
import java.io.ByteArrayInputStream ;
import java.io.IOException ;
import java.io.InputStream ;
2016-10-12 00:34:51 +02:00
import java.text.DecimalFormat ;
import java.util.Date ;
2015-01-15 23:20:17 +01:00
import javax.imageio.ImageIO ;
2016-10-12 00:34:51 +02:00
import javax.swing.BorderFactory ;
2016-10-31 15:27:20 +01:00
import javax.swing.BoxLayout ;
2015-01-15 23:20:17 +01:00
import javax.swing.ImageIcon ;
import javax.swing.JButton ;
import javax.swing.JLabel ;
2016-10-12 00:34:51 +02:00
import javax.swing.JPanel ;
import javax.swing.Spring ;
import javax.swing.SpringLayout ;
2015-01-15 23:20:17 +01:00
import com.sheepit.client.Client ;
2016-08-01 00:47:29 +02:00
import com.sheepit.client.Job ;
import com.sheepit.client.RenderProcess ;
2015-01-15 23:20:17 +01:00
import com.sheepit.client.Server ;
2016-10-12 00:34:51 +02:00
import com.sheepit.client.Stats ;
import com.sheepit.client.Utils ;
2015-10-27 21:00:44 +00:00
import com.sheepit.client.os.OS ;
2015-01-15 23:20:17 +01:00
import com.sheepit.client.standalone.GuiSwing ;
import com.sheepit.client.standalone.GuiSwing.ActivityType ;
public class Working implements Activity {
2017-05-07 20:55:17 +02:00
private GuiSwing parent ;
2015-01-15 23:20:17 +01:00
2017-05-07 20:55:17 +02:00
private JLabel statusContent ;
private JLabel renderedFrameContent ;
private JLabel remainingFrameContent ;
private JLabel lastRenderTime ;
private JLabel lastRender ;
private JLabel creditEarned ;
private JButton pauseButton ;
private JButton exitAfterFrame ;
private JLabel current_project_name_value ;
private JLabel current_project_duration_value ;
private JLabel currrent_project_progression_value ;
2017-05-07 21:00:20 +02:00
private JLabel current_project_compute_method_value ;
2017-05-07 20:55:17 +02:00
private JLabel user_info_points_total_value ;
private JLabel waiting_projects_value ;
private JLabel connected_machines_value ;
private JLabel user_info_total_rendertime_this_session_value ;
2015-01-15 23:20:17 +01:00
public Working ( GuiSwing parent_ ) {
parent = parent_ ;
statusContent = new JLabel ( " Init " ) ;
2016-10-12 00:34:51 +02:00
renderedFrameContent = new JLabel ( " " ) ;
remainingFrameContent = new JLabel ( " " ) ;
2015-03-02 18:05:39 +00:00
creditEarned = new JLabel ( " " ) ;
2016-10-12 00:34:51 +02:00
current_project_name_value = new JLabel ( " " ) ;
current_project_duration_value = new JLabel ( " " ) ;
currrent_project_progression_value = new JLabel ( " " ) ;
2017-05-07 21:00:20 +02:00
current_project_compute_method_value = new JLabel ( " " ) ;
2016-10-12 00:34:51 +02:00
user_info_points_total_value = new JLabel ( " " ) ;
waiting_projects_value = new JLabel ( " " ) ;
connected_machines_value = new JLabel ( " " ) ;
user_info_total_rendertime_this_session_value = new JLabel ( " " ) ;
2016-10-31 15:27:20 +01:00
lastRenderTime = new JLabel ( " " ) ;
2016-10-12 00:34:51 +02:00
lastRender = new JLabel ( " " ) ;
2015-01-15 23:20:17 +01:00
}
@Override
public void show ( ) {
2016-10-12 00:34:51 +02:00
// current project
JPanel current_project_panel = new JPanel ( new SpringLayout ( ) ) ;
current_project_panel . setBorder ( BorderFactory . createTitledBorder ( " Project " ) ) ;
2015-07-29 16:51:34 -06:00
2017-02-18 14:31:43 +01:00
JLabel current_project_status = new JLabel ( " Status: " , JLabel . TRAILING ) ;
JLabel current_project_name = new JLabel ( " Name: " , JLabel . TRAILING ) ;
JLabel current_project_duration = new JLabel ( " Rendering for: " , JLabel . TRAILING ) ;
JLabel current_project_progression = new JLabel ( " Remaining: " , JLabel . TRAILING ) ;
2017-05-07 21:00:20 +02:00
JLabel current_project_compute_method_label = new JLabel ( " Compute method: " , JLabel . TRAILING ) ;
2015-01-15 23:20:17 +01:00
2016-10-12 00:34:51 +02:00
current_project_panel . add ( current_project_status ) ;
current_project_panel . add ( statusContent ) ;
2015-07-29 16:51:34 -06:00
2016-10-12 00:34:51 +02:00
current_project_panel . add ( current_project_name ) ;
current_project_panel . add ( current_project_name_value ) ;
2015-01-15 23:20:17 +01:00
2016-10-12 00:34:51 +02:00
current_project_panel . add ( current_project_duration ) ;
current_project_panel . add ( current_project_duration_value ) ;
2015-01-15 23:20:17 +01:00
2016-10-12 00:34:51 +02:00
current_project_panel . add ( current_project_progression ) ;
current_project_panel . add ( currrent_project_progression_value ) ;
2015-01-15 23:20:17 +01:00
2017-05-07 21:00:20 +02:00
current_project_panel . add ( current_project_compute_method_label ) ;
current_project_panel . add ( current_project_compute_method_value ) ;
2016-10-12 00:34:51 +02:00
// user info
JPanel session_info_panel = new JPanel ( new SpringLayout ( ) ) ;
session_info_panel . setBorder ( BorderFactory . createTitledBorder ( " Session infos " ) ) ;
2015-01-15 23:20:17 +01:00
2017-02-18 14:31:43 +01:00
JLabel user_info_credits_this_session = new JLabel ( " Points earned: " , JLabel . TRAILING ) ;
JLabel user_info_total_rendertime_this_session = new JLabel ( " Duration: " , JLabel . TRAILING ) ;
JLabel user_info_rendered_frame_this_session = new JLabel ( " Rendered frames: " , JLabel . TRAILING ) ;
2015-03-02 18:05:39 +00:00
2016-10-12 00:34:51 +02:00
session_info_panel . add ( user_info_credits_this_session ) ;
session_info_panel . add ( creditEarned ) ;
2015-03-02 18:05:39 +00:00
2016-10-12 00:34:51 +02:00
session_info_panel . add ( user_info_rendered_frame_this_session ) ;
session_info_panel . add ( renderedFrameContent ) ;
2015-03-02 18:05:39 +00:00
2016-10-12 00:34:51 +02:00
session_info_panel . add ( user_info_total_rendertime_this_session ) ;
session_info_panel . add ( user_info_total_rendertime_this_session_value ) ;
2015-01-15 23:20:17 +01:00
2016-10-12 00:34:51 +02:00
// global stats
JPanel global_stats_panel = new JPanel ( new SpringLayout ( ) ) ;
global_stats_panel . setBorder ( BorderFactory . createTitledBorder ( " Global stats " ) ) ;
2015-01-15 23:20:17 +01:00
2017-02-18 14:31:43 +01:00
JLabel global_stats_machine_connected = new JLabel ( " Machines connected: " , JLabel . TRAILING ) ;
JLabel global_stats_remaining_frame = new JLabel ( " Remaining frames: " , JLabel . TRAILING ) ;
JLabel global_stats_waiting_project = new JLabel ( " Remaining projects: " , JLabel . TRAILING ) ;
JLabel global_stats_user_points = new JLabel ( " User's points: " , JLabel . TRAILING ) ;
2015-01-15 23:20:17 +01:00
2016-10-12 00:34:51 +02:00
global_stats_panel . add ( global_stats_waiting_project ) ;
global_stats_panel . add ( waiting_projects_value ) ;
2015-01-15 23:20:17 +01:00
2016-10-12 00:34:51 +02:00
global_stats_panel . add ( global_stats_machine_connected ) ;
global_stats_panel . add ( connected_machines_value ) ;
2015-01-15 23:20:17 +01:00
2016-10-12 00:34:51 +02:00
global_stats_panel . add ( global_stats_remaining_frame ) ;
global_stats_panel . add ( remainingFrameContent ) ;
2015-01-15 23:20:17 +01:00
2016-10-12 00:34:51 +02:00
global_stats_panel . add ( global_stats_user_points ) ;
global_stats_panel . add ( user_info_points_total_value ) ;
2015-01-15 23:20:17 +01:00
2016-10-12 00:34:51 +02:00
// last frame
JPanel last_frame_panel = new JPanel ( ) ;
2016-10-31 15:27:20 +01:00
last_frame_panel . setLayout ( new BoxLayout ( last_frame_panel , BoxLayout . Y_AXIS ) ) ;
2016-10-12 00:34:51 +02:00
last_frame_panel . setBorder ( BorderFactory . createTitledBorder ( " Last rendered frame " ) ) ;
lastRender . setIcon ( new ImageIcon ( new BufferedImage ( 200 , 120 , BufferedImage . TYPE_INT_ARGB ) ) ) ;
2016-10-31 15:27:20 +01:00
lastRender . setAlignmentX ( Component . CENTER_ALIGNMENT ) ;
lastRenderTime . setAlignmentX ( Component . CENTER_ALIGNMENT ) ;
last_frame_panel . add ( lastRenderTime ) ;
2016-10-12 00:34:51 +02:00
last_frame_panel . add ( lastRender ) ;
2015-07-29 16:51:34 -06:00
2016-10-12 00:34:51 +02:00
ImageIcon image = new ImageIcon ( getClass ( ) . getResource ( " /title.png " ) ) ;
JLabel labelImage = new JLabel ( image ) ;
labelImage . setAlignmentX ( Component . CENTER_ALIGNMENT ) ;
parent . getContentPane ( ) . add ( labelImage ) ;
JPanel buttonsPanel = new JPanel ( new GridLayout ( 2 , 2 ) ) ;
2015-01-15 23:20:17 +01:00
JButton settingsButton = new JButton ( " Settings " ) ;
settingsButton . addActionListener ( new SettingsAction ( ) ) ;
2015-01-17 22:40:24 +01:00
pauseButton = new JButton ( " Pause " ) ;
2017-01-29 21:03:38 +01:00
Client client = parent . getClient ( ) ;
if ( client ! = null & & client . isSuspended ( ) ) {
pauseButton . setText ( " Resume " ) ;
}
2015-01-15 23:20:17 +01:00
pauseButton . addActionListener ( new PauseAction ( ) ) ;
2015-07-29 16:51:34 -06:00
2015-10-27 21:00:44 +00:00
JButton blockJob = new JButton ( " Block this project " ) ;
blockJob . addActionListener ( new blockJobAction ( ) ) ;
2015-08-05 19:58:11 +01:00
exitAfterFrame = new JButton ( " Exit after this frame " ) ;
exitAfterFrame . addActionListener ( new ExitAfterAction ( ) ) ;
2016-10-12 00:34:51 +02:00
buttonsPanel . add ( settingsButton ) ;
buttonsPanel . add ( pauseButton ) ;
buttonsPanel . add ( blockJob ) ;
buttonsPanel . add ( exitAfterFrame ) ;
parent . getContentPane ( ) . setLayout ( new GridBagLayout ( ) ) ;
GridBagConstraints global_constraints = new GridBagConstraints ( ) ;
global_constraints . fill = GridBagConstraints . HORIZONTAL ;
global_constraints . weightx = 1 ;
global_constraints . gridx = 0 ;
parent . getContentPane ( ) . add ( current_project_panel , global_constraints ) ;
parent . getContentPane ( ) . add ( global_stats_panel , global_constraints ) ;
parent . getContentPane ( ) . add ( session_info_panel , global_constraints ) ;
parent . getContentPane ( ) . add ( last_frame_panel , global_constraints ) ;
parent . getContentPane ( ) . add ( buttonsPanel , global_constraints ) ;
Spring widthLeftColumn = getBestWidth ( current_project_panel , 4 , 2 ) ;
widthLeftColumn = Spring . max ( widthLeftColumn , getBestWidth ( global_stats_panel , 4 , 2 ) ) ;
widthLeftColumn = Spring . max ( widthLeftColumn , getBestWidth ( session_info_panel , 3 , 2 ) ) ;
2017-05-07 21:00:20 +02:00
alignPanel ( current_project_panel , 5 , 2 , widthLeftColumn ) ;
2016-10-12 00:34:51 +02:00
alignPanel ( global_stats_panel , 4 , 2 , widthLeftColumn ) ;
alignPanel ( session_info_panel , 3 , 2 , widthLeftColumn ) ;
2015-01-15 23:20:17 +01:00
}
public void setStatus ( String msg_ ) {
2016-10-12 00:34:51 +02:00
statusContent . setText ( " <html> " + msg_ + " </html> " ) ;
}
public void setRenderingProjectName ( String msg_ ) {
current_project_name_value . setText ( " <html> " + ( msg_ . length ( ) > 26 ? msg_ . substring ( 0 , 26 ) : msg_ ) + " </html> " ) ;
2015-01-15 23:20:17 +01:00
}
2016-10-12 00:34:51 +02:00
public void setRemainingTime ( String time_ ) {
currrent_project_progression_value . setText ( " <html> " + time_ + " </html> " ) ;
}
public void setRenderingTime ( String time_ ) {
current_project_duration_value . setText ( " <html> " + time_ + " </html> " ) ;
}
2017-05-07 21:00:20 +02:00
public void setComputeMethod ( String computeMethod_ ) {
this . current_project_compute_method_value . setText ( computeMethod_ ) ;
}
2016-10-12 00:34:51 +02:00
public void displayStats ( Stats stats ) {
DecimalFormat df = new DecimalFormat ( " ##,##,##,##,##,##,##0 " ) ;
remainingFrameContent . setText ( df . format ( stats . getRemainingFrame ( ) ) ) ;
creditEarned . setText ( df . format ( stats . getCreditsEarnedDuringSession ( ) ) ) ;
user_info_points_total_value . setText ( df . format ( stats . getCreditsEarned ( ) ) ) ;
waiting_projects_value . setText ( df . format ( stats . getWaitingProject ( ) ) ) ;
connected_machines_value . setText ( df . format ( stats . getConnectedMachine ( ) ) ) ;
updateTime ( ) ;
}
public void updateTime ( ) {
if ( this . parent . getClient ( ) . getStartTime ( ) ! = 0 ) {
user_info_total_rendertime_this_session_value . setText ( Utils . humanDuration ( new Date ( ( new Date ( ) . getTime ( ) - this . parent . getClient ( ) . getStartTime ( ) ) ) ) ) ;
}
Job job = this . parent . getClient ( ) . getRenderingJob ( ) ;
if ( job ! = null & & job . getProcessRender ( ) ! = null & & job . getProcessRender ( ) . getStartTime ( ) > 0 ) {
current_project_duration_value . setText ( " <html> " + Utils . humanDuration ( new Date ( ( new Date ( ) . getTime ( ) - job . getProcessRender ( ) . getStartTime ( ) ) ) ) + " </html> " ) ;
}
else {
current_project_duration_value . setText ( " " ) ;
}
2015-01-15 23:20:17 +01:00
}
public void setRenderedFrame ( int n ) {
renderedFrameContent . setText ( String . valueOf ( n ) ) ;
showLastRender ( ) ;
}
public void showLastRender ( ) {
Client client = parent . getClient ( ) ;
if ( client ! = null ) {
2016-10-31 15:27:20 +01:00
Job lastJob = client . getPreviousJob ( ) ;
2015-01-15 23:20:17 +01:00
Server server = client . getServer ( ) ;
if ( server ! = null ) {
byte [ ] data = server . getLastRender ( ) ;
if ( data ! = null ) {
InputStream is = new ByteArrayInputStream ( data ) ;
try {
BufferedImage image = ImageIO . read ( is ) ;
2016-09-11 13:33:34 +02:00
if ( image ! = null ) {
lastRender . setIcon ( new ImageIcon ( image ) ) ;
2016-10-31 15:27:20 +01:00
if ( lastJob ! = null ) {
// don't use lastJob.getProcessRender().getDuration() due to timezone
if ( lastJob . getProcessRender ( ) . getDuration ( ) > 1 ) {
lastRenderTime . setText ( " Render time : " + Utils . humanDuration ( new Date ( lastJob . getProcessRender ( ) . getEndTime ( ) - lastJob . getProcessRender ( ) . getStartTime ( ) ) ) ) ;
}
}
2016-09-11 13:33:34 +02:00
}
2015-01-15 23:20:17 +01:00
}
catch ( IOException e ) {
System . out . println ( " Working::showLastRender() exception " + e ) ;
e . printStackTrace ( ) ;
}
}
}
}
}
2016-10-12 00:34:51 +02:00
private void alignPanel ( Container parent , int rows , int cols , Spring width ) {
SpringLayout layout ;
try {
layout = ( SpringLayout ) parent . getLayout ( ) ;
}
catch ( ClassCastException exc ) {
System . err . println ( " The first argument to makeCompactGrid must use SpringLayout. " ) ;
return ;
}
Spring x = Spring . constant ( 0 ) ;
for ( int c = 0 ; c < cols ; c + + ) {
for ( int r = 0 ; r < rows ; r + + ) {
SpringLayout . Constraints constraints = getConstraintsForCell ( r , c , parent , cols ) ;
constraints . setX ( x ) ;
constraints . setWidth ( width ) ;
}
x = Spring . sum ( x , width ) ;
}
Spring y = Spring . constant ( 0 ) ;
for ( int r = 0 ; r < rows ; r + + ) {
Spring height = Spring . constant ( 0 ) ;
for ( int c = 0 ; c < cols ; c + + ) {
height = Spring . max ( height , getConstraintsForCell ( r , c , parent , cols ) . getHeight ( ) ) ;
}
for ( int c = 0 ; c < cols ; c + + ) {
SpringLayout . Constraints constraints = getConstraintsForCell ( r , c , parent , cols ) ;
constraints . setY ( y ) ;
constraints . setHeight ( height ) ;
2015-03-02 18:05:39 +00:00
}
2016-10-12 00:34:51 +02:00
y = Spring . sum ( y , height ) ;
2015-03-02 18:05:39 +00:00
}
2016-10-12 00:34:51 +02:00
SpringLayout . Constraints pCons = layout . getConstraints ( parent ) ;
pCons . setConstraint ( SpringLayout . SOUTH , y ) ;
pCons . setConstraint ( SpringLayout . EAST , x ) ;
}
private Spring getBestWidth ( Container parent , int rows , int cols ) {
Spring x = Spring . constant ( 0 ) ;
Spring width = Spring . constant ( 0 ) ;
for ( int c = 0 ; c < cols ; c + + ) {
for ( int r = 0 ; r < rows ; r + + ) {
width = Spring . max ( width , getConstraintsForCell ( r , c , parent , cols ) . getWidth ( ) ) ;
}
}
return width ;
}
private SpringLayout . Constraints getConstraintsForCell ( int row , int col , Container parent , int cols ) {
SpringLayout layout = ( SpringLayout ) parent . getLayout ( ) ;
Component c = parent . getComponent ( row * cols + col ) ;
return layout . getConstraints ( c ) ;
2015-03-02 18:05:39 +00:00
}
2015-01-15 23:20:17 +01:00
class PauseAction implements ActionListener {
@Override
public void actionPerformed ( ActionEvent e ) {
Client client = parent . getClient ( ) ;
if ( client ! = null ) {
2015-01-17 22:40:24 +01:00
if ( client . isSuspended ( ) ) {
pauseButton . setText ( " Pause " ) ;
client . resume ( ) ;
}
else {
pauseButton . setText ( " Resume " ) ;
client . suspend ( ) ;
}
2015-01-15 23:20:17 +01:00
}
}
}
class SettingsAction implements ActionListener {
@Override
public void actionPerformed ( ActionEvent e ) {
if ( parent ! = null ) {
parent . showActivity ( ActivityType . SETTINGS ) ;
}
}
}
2015-08-05 19:58:11 +01:00
class ExitAfterAction implements ActionListener {
@Override
public void actionPerformed ( ActionEvent e ) {
Client client = parent . getClient ( ) ;
if ( client ! = null ) {
if ( client . isRunning ( ) ) {
exitAfterFrame . setText ( " Cancel exit " ) ;
client . askForStop ( ) ;
}
else {
exitAfterFrame . setText ( " Exit after this frame " ) ;
client . cancelStop ( ) ;
}
}
}
}
2015-08-05 19:35:13 +01:00
2015-10-27 21:00:44 +00:00
class blockJobAction implements ActionListener {
@Override
public void actionPerformed ( ActionEvent e ) {
Client client = parent . getClient ( ) ;
if ( client ! = null ) {
2016-08-01 00:47:29 +02:00
Job job = client . getRenderingJob ( ) ;
if ( job ! = null ) {
2017-02-19 14:19:48 +01:00
job . block ( ) ;
2016-08-01 00:47:29 +02:00
}
2015-10-27 21:00:44 +00:00
}
}
}
2015-01-15 23:20:17 +01:00
}