Package net.sourceforge.ganttproject.gui

Source Code of net.sourceforge.ganttproject.gui.GanttTaskPropertiesBean

package net.sourceforge.ganttproject.gui;

/**
*
* <p>Title: </p>
*
* <p>Description: Provide the properties of selected task</p>
*
* <p>Copyright: Copyright (c) 2003</p>
*
* <p>Company: </p>
*
* @author ganttproject
*
* @version 1.0
*
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.util.Hashtable;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.SpringLayout;
import javax.swing.UIManager;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.tree.DefaultMutableTreeNode;

import org.jdesktop.swing.JXDatePicker;

import net.sourceforge.ganttproject.GanttCalendar;
import net.sourceforge.ganttproject.GanttGraphicArea;
import net.sourceforge.ganttproject.GanttProject;
import net.sourceforge.ganttproject.GanttTask;
import net.sourceforge.ganttproject.GanttTree2;
import net.sourceforge.ganttproject.IGanttProject;
import net.sourceforge.ganttproject.Mediator;
import net.sourceforge.ganttproject.gui.options.SpringUtilities;
import net.sourceforge.ganttproject.gui.taskproperties.CustomColumnsPanel;
import net.sourceforge.ganttproject.gui.taskproperties.TaskAllocationsPanel;
import net.sourceforge.ganttproject.gui.taskproperties.TaskDependenciesPanel;
import net.sourceforge.ganttproject.language.GanttLanguage;
import net.sourceforge.ganttproject.resource.HumanResourceManager;
import net.sourceforge.ganttproject.roles.RoleManager;
import net.sourceforge.ganttproject.shape.JPaintCombo;
import net.sourceforge.ganttproject.shape.ShapeConstants;
import net.sourceforge.ganttproject.shape.ShapePaint;
import net.sourceforge.ganttproject.task.Task;
import net.sourceforge.ganttproject.task.TaskContainmentHierarchyFacade;
import net.sourceforge.ganttproject.task.TaskImpl;
import net.sourceforge.ganttproject.task.TaskManager;
import net.sourceforge.ganttproject.task.TaskMutator;
import net.sourceforge.ganttproject.util.BrowserControl;

/**
* Real panel for editing task properties
*/
public class GanttTaskPropertiesBean

extends JPanel {

    private JXDatePicker myStartDatePicker;
    private JXDatePicker myEndDatePicker;
    private JXDatePicker myThirdDatePicker;
    // Input attributes

    // protected GanttTask selectedTask; //Task whose properties will be shown

    protected GanttTask[] selectedTasks;

    //private GanttTree2 tree; // GanttTree that contain all the tasks information

    private GanttLanguage language = GanttLanguage.getInstance(); // language

    // Output attributes: you can find the definition is GanttTask

    // private String name;

    private int length;

    private int percentComplete;

    private int priority;

    private GanttCalendar start;

    private GanttCalendar end;

    private GanttCalendar third;

    private boolean bilan;

  private boolean isProjectTask;

    private String notes;

    // private GanttTask selectedTaskClone;

    // private Hashtable managerHash;
    //
    // private Hashtable assignedResources = new Hashtable();
    // private attributes for internal use

    GridBagConstraints gbc = new GridBagConstraints();

    FlowLayout flowL = new FlowLayout(FlowLayout.LEFT, 10, 10);

    JTabbedPane tabbedPane; // TabbedPane that include the following four items

    JPanel generalPanel;

    JPanel predecessorsPanel;

    JPanel resourcesPanel;

    JPanel notesPanel;

    // Components on general pannel

    JPanel firstRowPanel1; // components in first row

    JTextField nameField1;

    JTextField durationField1;

    JLabel nameLabel1;

    JLabel durationLabel1;

    JLabel lblWebLink;

    JTextField tfWebLink;

    JButton bWebLink;

    JPanel secondRowPanel1; // components in second row

    JSpinner percentCompleteSlider;

    JLabel percentCompleteLabel1;

    JLabel priorityLabel1;

    JComboBox priorityComboBox;

    JPanel thirdRowPanel1; // componets in third row

    JTextField startDateField1;

    JTextField finishDateField1;

    JTextField thirdDateField1;

    JLabel startDateLabel1;

    JLabel finishDateLabel1;

    JComboBox thirdDateComboBox;

    JButton startDateButton1;

    JButton finishDateButton1;

    JButton thirdDateButton1;

    JPanel lastRowPanel1; // components in last row

    JPanel webLinkPanel; // components in web link panel

    JLabel mileStoneLabel1;

    JCheckBox mileStoneCheckBox1;

    JCheckBox projectTaskCheckBox1;

    JButton colorButton;


    boolean isColorChanged;

    JButton colorSpace;

    JPanel colorPanel;

    /** Shape chooser combo Box */
    JPaintCombo shapeComboBox;

    // Components on predecessors pannel

    JLabel nameLabel2; // first row, here the textfield is un-editable

    JLabel durationLabel2;

    JTextField nameField2;

    JPanel firstRowPanel2;

    JScrollPane predecessorsScrollPane; // second row, a table

    JLabel nameLabelNotes;

    JLabel durationLabelNotes;

    JTextField nameFieldNotes;

    JTextField durationFieldNotes;

    JScrollPane scrollPaneNotes;

    JTextArea noteAreaNotes;

    JPanel firstRowPanelNotes;

    JPanel secondRowPanelNotes;

    // Component on the SOUTH ok CANCEL buttons

    //public JButton okButton;

    //JButton cancelButton;

    //JPanel southPanel;

    private boolean onlyOneTask = false;

    private String taskWebLink;

    private boolean taskIsMilestone;

    private GanttCalendar taskStartDate;

    private GanttCalendar taskThirdDate;

    private int taskThirdDateConstraint;

  private boolean taskIsProjectTask;

    private int taskLength;

    private String taskNotes;

    private int taskCompletionPercentage;

    private int taskPriority;

    private ShapePaint taskShape;

    private CustomColumnsPanel myCustomColumnPanel = null;

    // private ResourcesTableModel myResourcesTableModel;
    private TaskDependenciesPanel myDependenciesPanel;

    private TaskAllocationsPanel[] myAllocationsPanel;

    //private boolean isStartFixed;

//    private boolean isFinishFixed;

    private final HumanResourceManager myHumanResourceManager;

    private final RoleManager myRoleManager;

    private Task myUnpluggedClone;
  private TaskManager myTaskManager;
  private IGanttProject myProject;
  private UIFacade myUIfacade;

    /** add a component to container by using GridBagConstraints. */

    private void addUsingGBL(Container container, Component component,

    GridBagConstraints gbc, int x,

    int y, int w, int h) {
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = w;
        gbc.gridheight = h;
        gbc.weighty = 0;
        container.add(component, gbc);
    }

    /** set the first row in all the tabbed pane. thus give them a common look */

    private void setFirstRow(Container container, GridBagConstraints gbc,
            JLabel nameLabel, JTextField nameField, JLabel durationLabel,
            JTextField durationField) {
        container.setLayout(new GridBagLayout());
        gbc.weightx = 0;
        gbc.weighty = 0;
        gbc.anchor = GridBagConstraints.WEST;
        gbc.insets.right = 15;
        gbc.insets.left = 10;
        gbc.insets.top = 10;
        addUsingGBL(container, nameLabel, gbc, 0, 0, 1, 1);
        addUsingGBL(container, nameField, gbc, 1, 0, 1, 1);
        addUsingGBL(container, durationLabel, gbc, 2, 0, 1, 1);
        gbc.weightx = 1;
        addUsingGBL(container, durationField, gbc, 3, 0, 1, 1);
    }

    /** Construct the general panel */
    private void constructGeneralPanel() {
        generalPanel = new JPanel(new GridBagLayout());
        // first row
        nameLabel1 = new JLabel(language.getText("name") + ":");
        nameField1 = new JTextField(20);
        nameField1.setName("name_of_task");

        if (!onlyOneTask) {
            nameLabel1.setVisible(false);
            nameField1.setVisible(false);
        }

        durationLabel1 = new JLabel(language.getText("length") + ":");
        durationField1 = new JTextField(8);
        durationField1.setName("length");
        firstRowPanel1 = new JPanel(flowL);
        setFirstRow(firstRowPanel1, gbc, nameLabel1, nameField1,
                durationLabel1, durationField1);
        // second row
        percentCompleteLabel1 = new JLabel(language.getText("advancement")); // Progress
        SpinnerNumberModel spinnerModel = new SpinnerNumberModel(0, 0, 100, 1);
        percentCompleteSlider = new JSpinner(spinnerModel);

        secondRowPanel1 = new JPanel(flowL);
        secondRowPanel1.add(percentCompleteLabel1);
        // secondRowPanel1.add(percentCompleteField1);
        secondRowPanel1.add(percentCompleteSlider);
        priorityLabel1 = new JLabel(language.getText("priority"));
        secondRowPanel1.add(priorityLabel1);
        priorityComboBox = new JComboBox();
        priorityComboBox.addItem(language.getText("low"));
        priorityComboBox.addItem(language.getText("normal"));
        priorityComboBox.addItem(language.getText("hight"));
        priorityComboBox.setEditable(false);

        secondRowPanel1.add(priorityComboBox);

        // third row

        startDateLabel1 = new JLabel(language.getText("dateOfBegining") + ":");
        startDateField1 = new JTextField(12);
        startDateField1.setEditable(false);
        finishDateLabel1 = new JLabel(language.getText("dateOfEnd") + ":");

        finishDateField1 = new JTextField(12);
        finishDateField1.setEditable(false);
        thirdDateComboBox = new JComboBox();
        thirdDateComboBox.addItem("");
        thirdDateComboBox.addItem(language.getText("earliestBegin"));
        thirdDateComboBox.setName("third");
        thirdDateComboBox.setSelectedIndex(selectedTasks[0]
                .getThirdDateConstraint());
        thirdDateField1 = new JTextField(12);
        thirdDateField1.setEditable(false);

        ImageIcon icon = new ImageIcon(getClass().getResource(
                "/icons/calendar_16.gif"));

        startDateButton1 = new TestGanttRolloverButton(icon);
        startDateButton1.setName("start");
        startDateButton1.setToolTipText(GanttProject.getToolTip(language
                .getText("chooseDate")));
        finishDateButton1 = new TestGanttRolloverButton(icon);
        finishDateButton1.setName("finish");
        finishDateButton1.setToolTipText(GanttProject.getToolTip(language
                .getText("chooseDate")));
        thirdDateButton1 = new TestGanttRolloverButton(icon);
        thirdDateButton1.setName("third");
        thirdDateButton1.setToolTipText(GanttProject.getToolTip(language
                .getText("chooseDate")));

        if (selectedTasks[0].getThirdDateConstraint() == 0)
            thirdDateButton1.setEnabled(false);


        thirdRowPanel1 = new JPanel(flowL);
        thirdRowPanel1.setBorder(new TitledBorder(new EtchedBorder(), language
                .getText("date")));

        JPanel startDatePanel = new JPanel(
                new FlowLayout(FlowLayout.LEFT, 5, 0));
        startDatePanel.add(startDateLabel1);
        myStartDatePicker = createDatePicker(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setStart(new GanttCalendar(((JXDatePicker)e.getSource()).getDate()), false);
            }
        });
        startDatePanel.add(myStartDatePicker);
        //startDatePanel.add(startDateButton1);


        JPanel finishDatePanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5,
                0));
        finishDatePanel.add(finishDateLabel1);
        myEndDatePicker = createDatePicker(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setEnd(new GanttCalendar(((JXDatePicker)e.getSource()).getDate()), false);
            }
        });
        finishDatePanel.add(myEndDatePicker);
        //finishDatePanel.add(finishDateButton1);

        JPanel thirdDatePanel = new JPanel(
                new FlowLayout(FlowLayout.LEFT, 5, 0));
        thirdDatePanel.add(thirdDateComboBox);
        myThirdDatePicker = createDatePicker(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setThird(new GanttCalendar(((JXDatePicker)e.getSource()).getDate()), false);
            }
        });
        thirdDatePanel.add(myThirdDatePicker);
        //thirdDatePanel.add(thirdDateButton1);

        // thirdRowPanel1.add(startDatePanel);
        // thirdRowPanel1.add(finishDatePanel);
        // thirdRowPanel1.add(thirdDatePanel);
        addUsingGBL(thirdRowPanel1, startDatePanel, gbc, 0, 0, 1, 1);
        addUsingGBL(thirdRowPanel1, finishDatePanel, gbc, 0, 1, 1, 1);
        addUsingGBL(thirdRowPanel1, thirdDatePanel, gbc, 0, 2, 1, 1);

        // fourth row
    JCheckBox checkBox = constructCheckBox ();
        lastRowPanel1 = new JPanel(flowL);
    if (checkBox != null)
      lastRowPanel1.add(checkBox);


        JPanel shapePanel = new JPanel();
        shapePanel.setLayout(new BorderLayout());
        JLabel lshape = new JLabel("  " + language.getText("shape") + " ");
        shapeComboBox = new JPaintCombo(ShapeConstants.PATTERN_LIST);

        shapePanel.add(lshape, BorderLayout.WEST);
        shapePanel.add(shapeComboBox, BorderLayout.CENTER);

        colorButton = new JButton(language.getText("colorButton"));
        colorButton.setBackground(selectedTasks[0].getColor());
        final String colorChooserTitle = language.getText("selectColor");
        colorButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JDialog dialog;
                dialog = JColorChooser.createDialog(GanttTaskPropertiesBean.this, colorChooserTitle,
                        true, GanttDialogProperties.colorChooser,
                        new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                colorButton
                                        .setBackground(GanttDialogProperties.colorChooser
                                                .getColor());
                                isColorChanged = true;
                            }
                        }

                        , new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                // nothing to do for "Cancel"
                            }
                        });

                /*
                 * AbstractColorChooserPanel[] panels =
                 * GanttDialogProperties.colorChooser.getChooserPanels();
                 * GanttDialogProperties.colorChooser.removeChooserPanel(panels[0]);
                 * GanttDialogProperties.colorChooser.addChooserPanel(panels[0]);
                 */

                GanttDialogProperties.colorChooser.setColor(colorButton
                        .getBackground());
                dialog.show();
            }
        });

        colorSpace = new JButton(language.getText("defaultColor"));
        colorSpace.setBackground(GanttGraphicArea.taskDefaultColor);
        colorSpace.setToolTipText(GanttProject.getToolTip(language
                .getText("resetColor")));
        colorSpace.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                colorButton.setBackground(GanttGraphicArea.taskDefaultColor);
                isColorChanged = true;
            }
        });

        colorPanel = new JPanel();
        colorPanel.setLayout(new BorderLayout());
        colorPanel.add(colorButton, "West");
        colorPanel.add(colorSpace, "Center");
        colorPanel.add(shapePanel, BorderLayout.EAST);
        lastRowPanel1.add(colorPanel);

        // ---Set GridBagConstraints constant
        gbc.anchor = GridBagConstraints.WEST;
        gbc.insets.right = 15;
        gbc.insets.left = 10;
        gbc.insets.top = 10;
        addUsingGBL(generalPanel, firstRowPanel1, gbc, 0, 0, 1, 1);
        addUsingGBL(generalPanel, secondRowPanel1, gbc, 0, 1, 1, 1);
        addUsingGBL(generalPanel, thirdRowPanel1, gbc, 0, 2, 1, 1);
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.gridwidth = 1;
        gbc.gridheight = GridBagConstraints.RELATIVE;
        gbc.anchor = GridBagConstraints.WEST;
        gbc.weighty = 1;
        generalPanel.add(lastRowPanel1, gbc);

        // The panel for the web link
        webLinkPanel = new JPanel(flowL);
        lblWebLink = new JLabel(language.getText("webLink"));
        webLinkPanel.add(lblWebLink);
        tfWebLink = new JTextField(30);
        webLinkPanel.add(tfWebLink);
        bWebLink = new TestGanttRolloverButton(new ImageIcon(getClass()
                .getResource("/icons/web_16.gif")));
        bWebLink.setToolTipText(GanttProject.getToolTip(language
                .getText("openWebLink")));
        webLinkPanel.add(bWebLink);

        bWebLink.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // link to open the web link
                try {
                    if (!BrowserControl.displayURL(tfWebLink.getText())) {
                        GanttDialogInfo gdi = new GanttDialogInfo(null,
                                GanttDialogInfo.ERROR,
                                GanttDialogInfo.YES_OPTION, language
                                        .getText("msg4"), language
                                        .getText("error"));
                        gdi.show();
                    }
                } catch (Exception ex) {
                }
            }
        });

        gbc.gridy = 4;
        generalPanel.add(webLinkPanel, gbc);

    }

    /** Add the differents action listener on the differents widgets */
    public void addActionListener(ActionListener l) {

        nameField1.addActionListener(l);

        startDateButton1.addActionListener(l);

        finishDateButton1.addActionListener(l);

        thirdDateButton1.addActionListener(l);

        thirdDateComboBox.addActionListener(l);

        durationField1.addActionListener(l);

    }

    /** Change the name of the task on all textfiled of task name */
    public void changeNameOfTask() {
        if (nameField1 != null && nameFieldNotes != null) {
            String nameOfTask = nameField1.getText().trim();
            nameField1.setText(nameOfTask);
            if (onlyOneTask)
                myDependenciesPanel.nameChanged(nameOfTask);
            myAllocationsPanel[0].nameChanged(nameOfTask);
            nameFieldNotes.setText(nameOfTask);
        }
    }

    private void constructCustomColumnPanel(IGanttProject project) {
        myCustomColumnPanel = new CustomColumnsPanel(
            project.getTaskCustomColumnManager(),
            project.getCustomColumnsStorage(), myUIfacade);
    }

    /** Construct the predecessors tabbed pane */

    private void constructPredecessorsPanel() {
        myDependenciesPanel = new TaskDependenciesPanel(selectedTasks[0]);
        predecessorsPanel = myDependenciesPanel.getComponent();
    }

    /** Construct the resources panel */

    private void constructResourcesPanel() {
        myAllocationsPanel = new TaskAllocationsPanel[selectedTasks.length];
        for (int i = 0; i < myAllocationsPanel.length; i++) {
            myAllocationsPanel[i] = new TaskAllocationsPanel(selectedTasks[i],
                    myHumanResourceManager, myRoleManager, onlyOneTask);
            if (i != 0)
                myAllocationsPanel[i].getComponent();
        }
        resourcesPanel = myAllocationsPanel[0].getComponent();
    }

    /** construct the notes pannel */

    private void constructNotesPanel() {

        notesPanel = new JPanel(new GridBagLayout());

        // first row

        nameLabelNotes = new JLabel(language.getText("name") + ":");

        nameFieldNotes = new JTextField(20);

        if (!onlyOneTask) {
            nameLabelNotes.setVisible(false);
            nameFieldNotes.setVisible(false);
        }

        durationLabelNotes = new JLabel(language.getText("length") + ":");

        durationFieldNotes = new JTextField(8);

        nameFieldNotes.setEditable(false);

        durationFieldNotes.setEditable(false);

        firstRowPanelNotes = new JPanel();

        setFirstRow(firstRowPanelNotes, gbc, nameLabelNotes, nameFieldNotes,

        durationLabelNotes, durationFieldNotes);

        secondRowPanelNotes = new JPanel();

        secondRowPanelNotes.setBorder(new TitledBorder(new EtchedBorder(),
                language.getText("notesTask") + ":"));

        noteAreaNotes = new JTextArea(8, 40);
        noteAreaNotes.setLineWrap(true);
        noteAreaNotes.setWrapStyleWord(true);
        noteAreaNotes.setBackground(new Color(1.0f, 1.0f, 1.0f));

        scrollPaneNotes = new JScrollPane(noteAreaNotes);

        secondRowPanelNotes.add(scrollPaneNotes);

        JButton bdate = new TestGanttRolloverButton(new ImageIcon(getClass()
                .getResource("/icons/clock_16.gif")));
        bdate.setToolTipText(GanttProject.getToolTip(language
                .getText("putDate")));
        bdate.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                noteAreaNotes.append("\n" + GanttCalendar.getDateAndTime()
                        + "\n");
            }
        });
        secondRowPanelNotes.add(bdate);

        gbc.anchor = GridBagConstraints.WEST;

        gbc.insets.right = 15;

        gbc.insets.left = 10;

        gbc.insets.top = 10;

        gbc.weighty = 0;

        addUsingGBL(notesPanel, firstRowPanelNotes, gbc, 0, 0, 1, 1);

        gbc.weighty = 1;

        gbc.gridx = 0;

        gbc.gridy = 1;

        gbc.gridwidth = 1;

        gbc.gridheight = 1;

        notesPanel.add(secondRowPanelNotes, gbc);

    }

    /** Constructor */

    public GanttTaskPropertiesBean(GanttTask[] selectedTasks, IGanttProject project, UIFacade uifacade) {
        this.onlyOneTask = false;
        if (selectedTasks.length == 1)
            this.onlyOneTask = true;
        this.selectedTasks = selectedTasks;
        setInitialValues(selectedTasks[0]);
        myHumanResourceManager = (HumanResourceManager) project.getHumanResourceManager();
        myRoleManager = project.getRoleManager();
        myTaskManager = project.getTaskManager();
        myProject = project;
        myUIfacade = uifacade;
//    setTree(tree);
    init();

        // this.managerHash = managerHash;

        setSelectedTask();
    }

    private JXDatePicker createDatePicker(ActionListener listener) {
        ImageIcon calendarImage = new ImageIcon(getClass().getResource(
        "/icons/calendar_16.gif"));
        Icon nextMonth = new ImageIcon(getClass()
                .getResource("/icons/nextmonth.gif"));
        Icon prevMonth = new ImageIcon(getClass()
                .getResource("/icons/prevmonth.gif"));
        UIManager.put("JXDatePicker.arrowDown.image", calendarImage);
        UIManager.put("JXMonthView.monthUp.image", prevMonth);
        UIManager.put("JXMonthView.monthDown.image", nextMonth);
        UIManager.put("JXMonthView.monthCurrent.image", calendarImage);
        JXDatePicker result = new JXDatePicker();
        result.addActionListener(listener);
        return result;
    }
    /** Init the widgets */
    public void init() {

        tabbedPane = new JTabbedPane();
        tabbedPane.getModel().addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                changeNameOfTask();
                fireDurationChanged();
            }
        });
        constructGeneralPanel();

        tabbedPane.addTab(language.getText("general"), new ImageIcon(getClass()
                .getResource("/icons/properties_16.gif")), generalPanel);

        if (onlyOneTask) {
            constructPredecessorsPanel();
            tabbedPane.addTab(language.getText("predecessors"), new ImageIcon(
                    getClass().getResource("/icons/relashion.gif")),
                    predecessorsPanel);
        }

        constructResourcesPanel();

        tabbedPane.addTab(GanttProject.correctLabel(language.getText("human")),
                new ImageIcon(getClass().getResource("/icons/res_16.gif")),
                resourcesPanel);

        constructNotesPanel();

        tabbedPane.addTab(language.getText("notesTask"), new ImageIcon(
                getClass().getResource("/icons/note_16.gif")), notesPanel);

        setLayout(new BorderLayout());

        add(tabbedPane, BorderLayout.CENTER);

        constructCustomColumnPanel(myProject);
        tabbedPane.addTab(language.getText("customColumns"), new ImageIcon(
                getClass().getResource("/icons/custom.gif")),
                myCustomColumnPanel);
        tabbedPane.addFocusListener(new FocusAdapter() {
            private boolean isFirstFocusGain = true;
            public void focusGained(FocusEvent e) {
                super.focusGained(e);
                if (isFirstFocusGain) {
                    nameField1.requestFocus();
                    isFirstFocusGain = false;
                }
            }
        });
        tabbedPane.setBorder(BorderFactory.createEmptyBorder(2,0,5,0));
    }

    // Input methods

    /**
     * as the name indicated, it will not replace the original GanttTask in the
     * Tree.
     */

    public Task[] getReturnTask() {
        GanttTask[] returnTask = new GanttTask[selectedTasks.length];

        for (int i = 0; i < selectedTasks.length; i++) {
            if (myAllocationsPanel[0].getTableModel().isChanged()) {
                if (i != 0)
                    copyValues(myAllocationsPanel[0].getTableModel(),
                            myAllocationsPanel[i].getTableModel());

            }
            myAllocationsPanel[i].getTableModel().commit();
            returnTask[i] = selectedTasks[i];

            // returnTask.setTaskID(selectedTask.getTaskID());
            TaskMutator mutator = returnTask[i].createMutator();

            if (onlyOneTask) {
                mutator.setName(getTaskName()); // getName()
        mutator.setProjectTask (false);
            }
            if (this.taskWebLink != null && !this.taskWebLink.equals(getWebLink()))
                returnTask[i].setWebLink(getWebLink()); // getName()
      if (mileStoneCheckBox1 != null) {
        if (this.taskIsMilestone != isBilan())
                  mutator.setMilestone(isBilan());
      }
            else if (projectTaskCheckBox1 != null) {
        if (this.taskIsProjectTask != isProjectTask())
                  mutator.setProjectTask(isProjectTask());
            }
            if (!this.taskStartDate.equals(getStart()))
                mutator.setStart(getStart());
            if (((this.taskThirdDate == null) && (getThird() != null))
                    || ((this.taskThirdDate != null) && (getThird() == null))
                    || ((this.taskThirdDate != null) && (!this.taskThirdDate
                            .equals(getThird()))))
                mutator.setThird(getThird(), getThirdDateConstraint());

            if (getLength() > 0) {
                    mutator.setDuration(returnTask[i].getManager()
                            .createLength(getLength()));
            }
            if (!this.taskNotes.equals(getNotes()))
                returnTask[i].setNotes(getNotes());
            if (this.taskCompletionPercentage != getPercentComplete())
                mutator.setCompletionPercentage(getPercentComplete());
            if (this.taskPriority != getPriority())
                returnTask[i].setPriority(getPriority());
//            if (this.taskIsStartFixed != isStartFixed)
//                returnTask[i].setStartFixed(isStartFixed);
//            if (this.taskIsFinishFixed != isFinishFixed)
//                returnTask[i].setFinishFixed(isFinishFixed);
            if (isColorChanged)
                returnTask[i].setColor(colorButton.getBackground());
            if ((((this.taskShape == null) && (shapeComboBox.getSelectedIndex() != 0)))
                    || ((this.taskShape != null) && (!this.taskShape
                            .equals((ShapePaint) shapeComboBox
                                    .getSelectedPaint()))))
                returnTask[i].setShape(new ShapePaint(
                        (ShapePaint) shapeComboBox.getSelectedPaint(),
                        Color.white, returnTask[i].getColor()));
            if (returnTask[i].getShape() != null)
                returnTask[i].setShape(new ShapePaint(returnTask[i].getShape(),
                        Color.white, returnTask[i].getColor()));

            mutator.commit();
            if (onlyOneTask) {
                myDependenciesPanel.getTableModel().commit();
            }
            returnTask[i].applyThirdDateConstraint();
        }

        return returnTask;

    }

    /** as the name indicated */

    public void setSelectedTask() {

        // this.selectedTask = selectedTask;

        nameField1.setText(selectedTasks[0].getName());

        // nameField2.setText(selectedTask.toString());

        nameFieldNotes.setText(selectedTasks[0].toString());

        setName(selectedTasks[0].toString());

        durationField1.setText(selectedTasks[0].getLength() + "");

        // durationField2.setText(selectedTask.getLength() + "");

        durationFieldNotes.setText(selectedTasks[0].getLength() + "");

        percentCompleteSlider.setValue(new Integer(selectedTasks[0]
                .getCompletionPercentage()));
        percentCompleteLabel1.setText(language.getText("advancement"));

        priorityComboBox.setSelectedIndex(selectedTasks[0].getPriority());

        startDateField1.setText(selectedTasks[0].getStart().toString());

        finishDateField1.setText(selectedTasks[0].getEnd().toString());

        if (selectedTasks[0].isMilestone()) {
          enableMilestoneFriendlyControls(false);
        }
        if (selectedTasks[0].getThird() != null) {
            thirdDateField1.setText(selectedTasks[0].getThird().toString());
            setThird(selectedTasks[0].getThird().Clone(), true);
        }

        setStart(selectedTasks[0].getStart().Clone(), true);

        setEnd(selectedTasks[0].getEnd().Clone(), true);

        bilan = selectedTasks[0].isMilestone();

    isProjectTask = selectedTasks[0].isProjectTask();

    if (mileStoneCheckBox1 != null)
      mileStoneCheckBox1.setSelected(bilan);
        else if (projectTaskCheckBox1 != null)
      projectTaskCheckBox1.setSelected(isProjectTask);

        tfWebLink.setText(selectedTasks[0].getWebLink());

        if (selectedTasks[0].shapeDefined()) {
            for (int j = 0; j < ShapeConstants.PATTERN_LIST.length; j++) {
                if (selectedTasks[0].getShape().equals(
                        ShapeConstants.PATTERN_LIST[j])) {
                    shapeComboBox.setSelectedIndex(j);
                    break;
                }
            }
        }

        noteAreaNotes.setText(selectedTasks[0].getNotes());
        //setStartFixed(selectedTasks[0].isStartFixed());
//        setFinishFixed(selectedTasks[0].isFinishFixed());
        myUnpluggedClone = selectedTasks[0].unpluggedClone();
    }

    void enableMilestoneFriendlyControls(boolean enable) {
      finishDateField1.setEnabled(enable);
      myEndDatePicker.setEnabled(enable);
      durationField1.setEnabled(enable);
    }
    // Output methods

    /** as the name indicated */

    public boolean isBilan() {

        bilan = mileStoneCheckBox1.isSelected();

        return bilan;

    }

    public boolean isProjectTask() {

        isProjectTask = projectTaskCheckBox1.isSelected();

        return isProjectTask;

    }

    /** as the name indicated */

//    public GanttCalendar getEnd() {
//
//        return end;
//
//    }


    /** as the name indicated */

    public GanttCalendar getThird() {
        return third;
    }

    public int getThirdDateConstraint() {
        return thirdDateComboBox.getSelectedIndex();
    }

    /** as the name indicated */

    public int getLength() {
      try {
        length = Integer.parseInt(durationField1.getText().trim());
      } catch (NumberFormatException e) {

      }
      return length;
    }

    public void fireDurationChanged() {
        String value = durationField1.getText();
        try {
            int duration = Integer.parseInt(value);
            changeLength(duration);
        } catch (NumberFormatException e) {

        }

    }

    /** Set the duration of the task */
    public void changeLength(int _length) {
        if (_length <= 0) {
            _length = 1;
        }

        durationField1.setText(_length + "");
        if (onlyOneTask)
            myDependenciesPanel.durationChanged(_length);
        myAllocationsPanel[0].durationChanged(_length);
        durationFieldNotes.setText(_length + "");
        length = _length;
        // change the end date
        GanttCalendar _end = start.newAdd(length);
        this.end = _end;
        finishDateField1.setText(_end.toString());
    }

    /** as the name indicated */

    public String getNotes() {

        notes = noteAreaNotes.getText();

        return notes;

    }

    /** Return the name of the task */

    public String getTaskName() {
        String text = nameField1.getText();
        return text == null ? "" : text.trim();
    }

    /** @return the web link of the task. */
    public String getWebLink() {
        String text = tfWebLink.getText();
        return text == null ? "" : text.trim();
    }

    /** as the name indicated */

    public int getPercentComplete() {

        percentComplete = ((Integer) percentCompleteSlider.getValue())
                .hashCode();

        return percentComplete;

    }

    /** Return the priority level of the task */

    public int getPriority() {
        priority = priorityComboBox.getSelectedIndex();
        return priority;
    }

//    public void setStartFixed(boolean startFixed) {
//        isStartFixed = startFixed;
//        startDateField1.setForeground(isStartFixed ? Color.BLACK : Color.GRAY);
//    }

//    public void setFinishFixed(boolean startFixed) {
//        isFinishFixed = startFixed;
//        finishDateField1
//                .setForeground(isFinishFixed ? Color.BLACK : Color.GRAY);
//    }

    /** Return the start date of the task */
    public GanttCalendar getStart() {
        //start.setFixed(isStartFixed);
        return start;
    }

    public GanttCalendar getFinish() {
//        end.setFixed(isFinishFixed);
        return end;
    }

    /** Change the start date of the task */
    public void setStart(GanttCalendar dstart, boolean test) {
        myStartDatePicker.setDate(dstart.getTime());
        this.start = dstart;
        if (test == true) {
            return;
        }

//        this.setStartFixed(dstart.isFixed());

        if (this.start.compareTo(this.end) < 0) {
            adjustLength();
        } else {
            GanttCalendar _end = start.newAdd(this.taskLength);
            this.end = _end;
            //finishDateField1.setText(_end.toString());
            this.myEndDatePicker.setDate(this.end.getTime());
        }
    }

    /** Change the end date of the task */
    public void setEnd(GanttCalendar dend, boolean test) {
        myEndDatePicker.setDate(dend.getTime());
        this.end = dend;
        if (test == true) {
            return;
        }
//        this.setFinishFixed(dend.isFixed());

        if (this.start.compareTo(this.end) < 0) {
            adjustLength();
        } else {
            GanttCalendar _start = this.end.newAdd(-length);
            this.start = _start;
            startDateField1.setText(_start.toString());
        }
    }

    /** Change the third date of the task */
    public void setThird(GanttCalendar dthird, boolean test) {
        myThirdDatePicker.setDate(dthird.getTime());
        this.third = dthird;
        if (test) {
            return;
        }

        switch (thirdDateComboBox.getSelectedIndex()) {
        case TaskImpl.EARLIESTBEGIN:
            thirdDateButton1.setEnabled(true);
            break;
        case TaskImpl.NONE:
            thirdDateButton1.setEnabled(false);
            break;
        }
    }

    private void adjustLength() {
        myUnpluggedClone.setStart(this.start);
        myUnpluggedClone.setEnd(this.end);
        length = (int) myUnpluggedClone.getDuration().getLength();
        durationField1.setText("" + length);
        // durationField2.setText(""+length);
        myAllocationsPanel[0].durationChanged(length);
        durationFieldNotes.setText("" + length);
    }

    private void setInitialValues(GanttTask task) {
        this.taskWebLink = task.getWebLink();
        this.taskIsMilestone = task.isMilestone();
        this.taskStartDate = task.getStart();
        this.taskLength = task.getLength();
        this.taskNotes = task.getNotes();
        this.taskCompletionPercentage = task.getCompletionPercentage();
        this.taskPriority = task.getPriority();
        //this.taskIsStartFixed = task.isStartFixed();
//        this.taskIsFinishFixed = task.isFinishFixed();
        this.taskShape = task.getShape();
        this.taskThirdDate = task.getThird();
        this.taskThirdDateConstraint = task.getThirdDateConstraint();
    this.taskIsProjectTask = task.isProjectTask();
    }

    private void copyValues(ResourcesTableModel original,
            ResourcesTableModel clone) {
        for (int i = 0; i < clone.getRowCount(); i++)
            clone.setValueAt(null, i, 1);
        for (int j = 0; j < original.getRowCount(); j++)
            for (int k = 0; k < original.getColumnCount(); k++)
                clone.setValueAt(original.getValueAt(j, k), j, k);
    }

    private boolean canBeProjectTask(Task testedTask, TaskContainmentHierarchyFacade taskHierarchy) {
      Task[] nestedTasks = taskHierarchy.getNestedTasks(testedTask);
      if (nestedTasks.length==0) {
        return false;
      }
      for (Task parent = taskHierarchy.getContainer(testedTask); parent!=null; parent = taskHierarchy.getContainer(parent)) {
        if (parent.isProjectTask()) {
          return false;
        }
      }
      for (int i=0; i<nestedTasks.length; i++) {
        if (isProjectTaskOrContainsProjectTask(nestedTasks[i])) {
          return false;
        }
      }
      return true;
    }
  private boolean isProjectTaskOrContainsProjectTask(Task task) {
    if (task.isProjectTask()) {
      return true;
    }
    boolean result = false;
    Task[] nestedTasks = task.getNestedTasks();
    for (int i=0; i<nestedTasks.length; i++) {
      if (isProjectTaskOrContainsProjectTask(nestedTasks[i])) {
        result = true;
        break;
      }
    }
    return result;
  }

  private JCheckBox constructCheckBox () {
    boolean canBeProjectTask = true;
    boolean canBeMilestone = true;
    TaskContainmentHierarchyFacade taskHierarchy = myTaskManager.getTaskHierarchy();
    for (int i = 0 ; i < selectedTasks.length ; i++) {
      canBeMilestone &= !taskHierarchy.hasNestedTasks(selectedTasks[i]);
      canBeProjectTask &= canBeProjectTask(selectedTasks[i], taskHierarchy);
    }
    assert false==(canBeProjectTask && canBeMilestone);
    final JCheckBox result;
    if (canBeProjectTask) {
      result = new JCheckBox (language.getText("projectTask"));
      projectTaskCheckBox1 = result;
    }
    else if (canBeMilestone) {
      mileStoneCheckBox1 = new JCheckBox(new AbstractAction(language.getText("meetingPoint")) {
        public void actionPerformed(ActionEvent arg0) {
          enableMilestoneFriendlyControls(!isBilan());
        }
      });
      result = mileStoneCheckBox1;
    }
    else {
      result = null;
    }
    return result;
  }

}
TOP

Related Classes of net.sourceforge.ganttproject.gui.GanttTaskPropertiesBean

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.