forked from LupusNobilis/java-org.hwo.ui
NetPlan -> Gantt
parent
0d6222bad9
commit
1a7e8c35c2
|
@ -1,11 +1,11 @@
|
||||||
package org.hwo.ui.netplan;
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.hwo.datetime.DateTime;
|
import org.hwo.datetime.DateTime;
|
||||||
|
|
||||||
public class BaseNetPlanObject implements INetPlanObject {
|
public class BaseGanttObject implements IGanttObject {
|
||||||
|
|
||||||
private DateTime startTime,
|
private DateTime startTime,
|
||||||
endTime;
|
endTime;
|
||||||
|
@ -13,12 +13,12 @@ public class BaseNetPlanObject implements INetPlanObject {
|
||||||
private String label,
|
private String label,
|
||||||
detailedLabel;
|
detailedLabel;
|
||||||
|
|
||||||
List<INetPlanObject> dependencies;
|
List<IGanttObject> dependencies;
|
||||||
List<INetPlanResource> resources;
|
List<IGanttResource> resources;
|
||||||
|
|
||||||
public BaseNetPlanObject() {
|
public BaseGanttObject() {
|
||||||
dependencies = new LinkedList<INetPlanObject>();
|
dependencies = new LinkedList<IGanttObject>();
|
||||||
resources = new LinkedList<INetPlanResource>();
|
resources = new LinkedList<IGanttResource>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -49,42 +49,49 @@ public class BaseNetPlanObject implements INetPlanObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public INetPlanObject[] getDependencies() {
|
public IGanttObject[] getDependencies() {
|
||||||
return this.dependencies.toArray(new INetPlanObject[0]);
|
return this.dependencies.toArray(new IGanttObject[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addDependency(INetPlanObject depend) {
|
public void addDependency(IGanttObject depend) {
|
||||||
if (!this.dependencies.contains(depend))
|
if (!this.dependencies.contains(depend))
|
||||||
this.dependencies.add(depend);
|
this.dependencies.add(depend);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void removeDependency(INetPlanObject depend) {
|
public void removeDependency(IGanttObject depend) {
|
||||||
this.dependencies.remove(depend);
|
this.dependencies.remove(depend);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public INetPlanResource[] getResources() {
|
public IGanttResource[] getResources() {
|
||||||
return this.resources.toArray(new INetPlanResource[0]);
|
return this.resources.toArray(new IGanttResource[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addResource(INetPlanResource resource) {
|
public void addResource(IGanttResource resource) {
|
||||||
if (!this.resources.contains(resource))
|
if (!this.resources.contains(resource))
|
||||||
this.resources.add(resource);
|
this.resources.add(resource);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void removeResource(INetPlanResource resource) {
|
public void removeResource(IGanttResource resource) {
|
||||||
this.resources.remove(resource);
|
this.resources.remove(resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void replaceResource(IGanttResource oldResource, IGanttResource newResource) {
|
||||||
|
addResource(newResource);
|
||||||
|
removeResource(oldResource);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDetailedLabel() {
|
public String getDetailedLabel() {
|
||||||
// TODO Auto-generated method stub
|
return this.detailedLabel;
|
||||||
return null;
|
}
|
||||||
}public void setDetailedLabel(String detailedLabel) {
|
public void setDetailedLabel(String detailedLabel) {
|
||||||
this.detailedLabel = detailedLabel;
|
this.detailedLabel = detailedLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getShortLabel() {
|
public String getShortLabel() {
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
@ -92,5 +99,12 @@ public class BaseNetPlanObject implements INetPlanObject {
|
||||||
this.label = label;
|
this.label = label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addNotify(JGantt gantt) {
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void removeNotify(JGantt gantt) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
|
import org.hwo.datetime.DateTime;
|
||||||
|
|
||||||
|
public class BaseGanttResource implements IGanttResource {
|
||||||
|
|
||||||
|
private String shortLabel;
|
||||||
|
private String detailedLabel;
|
||||||
|
private int maxParallelUsage;
|
||||||
|
|
||||||
|
private ResourceAvailability resourceAvailability;
|
||||||
|
|
||||||
|
public BaseGanttResource(String shortLabel,String detailedLabel) {
|
||||||
|
this.shortLabel = shortLabel;
|
||||||
|
this.detailedLabel = detailedLabel;
|
||||||
|
this.maxParallelUsage = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLabel() {
|
||||||
|
return this.shortLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDetailedLabel() {
|
||||||
|
return this.detailedLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setResourceAvailability(
|
||||||
|
ResourceAvailability resourceAvailability) {
|
||||||
|
this.resourceAvailability = resourceAvailability;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResourceAvailability getAvailability() {
|
||||||
|
return resourceAvailability;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResourceAvailability getAvailability(DateTime fromDateTime) {
|
||||||
|
return resourceAvailability.findAvailableAfter(fromDateTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxParallelUsage() {
|
||||||
|
return this.maxParallelUsage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxParallelUsage(int maxParallelUsage) {
|
||||||
|
this.maxParallelUsage = maxParallelUsage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public DateTime calculateUsageTime(DateTime begin,int seconds){
|
||||||
|
ResourceAvailability ra = getAvailability(begin);
|
||||||
|
DateTime dt = new DateTime(begin);
|
||||||
|
|
||||||
|
if (ra != null && dt.isBefore(ra.getStartTime())){
|
||||||
|
dt = ra.getStartTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
while (ra != null){
|
||||||
|
int availSeconds = ra.getSeconds(dt);
|
||||||
|
|
||||||
|
//System.err.println(String.format("RES: %s needs %d seconds from %s. Has %d seconds.", shortLabel, seconds, dt.toString(), availSeconds));
|
||||||
|
|
||||||
|
if (availSeconds >= seconds){ // Soll kann erfüllt werden...
|
||||||
|
DateTime endTime = new DateTime(dt);
|
||||||
|
endTime.addSeconds(seconds);
|
||||||
|
return endTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
seconds -= availSeconds;
|
||||||
|
|
||||||
|
ra = ra.getNext();
|
||||||
|
dt = ra.getStartTime();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
|
public class GanttException extends Exception {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
|
import org.hwo.datetime.DateTime;
|
||||||
|
|
||||||
|
public interface GanttMouseEventListener {
|
||||||
|
|
||||||
|
public void mouseClick(JGantt gantt,IGanttResource ganttResource,DateTime dateTime,IGanttObject ganttObject);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
|
import org.hwo.datetime.DateTime;
|
||||||
|
|
||||||
|
public class GanttResolver {
|
||||||
|
JGantt gantt;
|
||||||
|
|
||||||
|
public GanttResolver(JGantt gantt) {
|
||||||
|
this.gantt = gantt;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Optimieren links: (Einsetzen)
|
||||||
|
*
|
||||||
|
* Schneidendes Objekt bei startTime finden, startTime korrigieren, wiederholen für abhängige in gleicher resource
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void leftOptimize(IGanttObject object){
|
||||||
|
|
||||||
|
for (IGanttResource resource: object.getResources()){
|
||||||
|
IGanttObject o = gantt.findObjectAt(resource, object.getStartTime());
|
||||||
|
|
||||||
|
if (o != null){
|
||||||
|
DateTime dt = o.getEndTime();
|
||||||
|
dt.addSeconds(1);
|
||||||
|
|
||||||
|
System.err.println(String.format("Resolver: Move Start Time of %s from %s to %s after end of %s",object.toString(),object.getStartTime(),dt.toString(),o.toString()));
|
||||||
|
|
||||||
|
object.setStartTime(dt);
|
||||||
|
|
||||||
|
for (IGanttObject dobj: gantt.findDependedObjects(o, resource)){
|
||||||
|
leftOptimize(dobj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Optimieren rechts: (Verschieben)
|
||||||
|
*
|
||||||
|
* Objekte mit StartTime innerhalb finden, und nach rechts verschieben
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void rightOptimize(IGanttObject object){
|
||||||
|
|
||||||
|
for (IGanttResource resource: object.getResources()){
|
||||||
|
IGanttObject o = gantt.findObjectAt(resource, object.getStartTime());
|
||||||
|
|
||||||
|
if (o != null){
|
||||||
|
DateTime dt = o.getEndTime();
|
||||||
|
dt.addSeconds(1);
|
||||||
|
|
||||||
|
System.err.println(String.format("Resolver: Move Start Time of %s from %s to %s after end of %s",object.toString(),object.getStartTime(),dt.toString(),o.toString()));
|
||||||
|
|
||||||
|
object.setStartTime(dt);
|
||||||
|
|
||||||
|
for (IGanttObject dobj: gantt.findDependedObjects(o, resource)){
|
||||||
|
leftOptimize(dobj);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
|
||||||
|
public interface IGanttDrawable {
|
||||||
|
|
||||||
|
void paint(Graphics2D g,Rectangle rect);
|
||||||
|
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
package org.hwo.ui.netplan;
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
import org.hwo.datetime.DateTime;
|
import org.hwo.datetime.DateTime;
|
||||||
|
|
||||||
public interface INetPlanObject {
|
public interface IGanttObject {
|
||||||
|
|
||||||
boolean canMove(); // Startzeitpunkt kann verändert werden
|
boolean canMove(); // Startzeitpunkt kann verändert werden
|
||||||
boolean canStretch(); // Dauer kann verändert werden
|
boolean canStretch(); // Dauer kann verändert werden
|
||||||
|
@ -21,17 +21,21 @@ public interface INetPlanObject {
|
||||||
String getDetailedLabel();
|
String getDetailedLabel();
|
||||||
|
|
||||||
/* Abhängige Objekte */
|
/* Abhängige Objekte */
|
||||||
INetPlanObject[] getDependencies();
|
IGanttObject[] getDependencies();
|
||||||
|
|
||||||
void addDependency(INetPlanObject depend);
|
void addDependency(IGanttObject depend);
|
||||||
void removeDependency(INetPlanObject depend);
|
void removeDependency(IGanttObject depend);
|
||||||
|
|
||||||
/* Notwendige Resourcen */
|
/* Notwendige Resourcen */
|
||||||
INetPlanResource[] getResources();
|
IGanttResource[] getResources();
|
||||||
|
|
||||||
void addResource(INetPlanResource resource);
|
void addResource(IGanttResource resource);
|
||||||
void removeResource(INetPlanResource resource);
|
void removeResource(IGanttResource resource);
|
||||||
|
|
||||||
|
void replaceResource(IGanttResource oldResource,IGanttResource newResource);
|
||||||
|
|
||||||
|
void addNotify(JGantt gantt);
|
||||||
|
void removeNotify(JGantt gantt);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
package org.hwo.ui.netplan;
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
import org.hwo.datetime.DateTime;
|
import org.hwo.datetime.DateTime;
|
||||||
|
|
||||||
public interface INetPlanResource {
|
public interface IGanttResource {
|
||||||
|
|
||||||
String getLabel();
|
String getLabel();
|
||||||
String getDetailedLabel();
|
String getDetailedLabel();
|
|
@ -0,0 +1,531 @@
|
||||||
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.FontMetrics;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.awt.event.MouseAdapter;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
|
import javax.swing.JViewport;
|
||||||
|
import javax.swing.Scrollable;
|
||||||
|
import javax.swing.SwingConstants;
|
||||||
|
|
||||||
|
import org.hwo.datetime.Date;
|
||||||
|
import org.hwo.datetime.DateTime;
|
||||||
|
import org.hwo.datetime.TimeOfDay;
|
||||||
|
|
||||||
|
public class JGantt extends JComponent {
|
||||||
|
|
||||||
|
GanttResolver resolver;
|
||||||
|
|
||||||
|
List<IGanttObject> ganttObjects;
|
||||||
|
List<IGanttResource> ganttResources;
|
||||||
|
|
||||||
|
List<IGanttDrawable> ganttDrawables;
|
||||||
|
|
||||||
|
Date firstDate;
|
||||||
|
int days;
|
||||||
|
|
||||||
|
int zoom;
|
||||||
|
|
||||||
|
boolean timeVisible;
|
||||||
|
|
||||||
|
|
||||||
|
boolean relevantChange;
|
||||||
|
|
||||||
|
JViewport topPane,
|
||||||
|
leftPane;
|
||||||
|
|
||||||
|
|
||||||
|
IGanttObject selectedObject;
|
||||||
|
|
||||||
|
|
||||||
|
List<GanttMouseEventListener> ganttMouseEventListener;
|
||||||
|
|
||||||
|
|
||||||
|
public JGantt() {
|
||||||
|
ganttMouseEventListener = new ArrayList<GanttMouseEventListener>();
|
||||||
|
|
||||||
|
resolver = new GanttResolver(this);
|
||||||
|
|
||||||
|
ganttObjects = new ArrayList<IGanttObject>();
|
||||||
|
ganttResources = new ArrayList<IGanttResource>();
|
||||||
|
ganttDrawables = new ArrayList<IGanttDrawable>();
|
||||||
|
|
||||||
|
firstDate = new Date();
|
||||||
|
days = 31;
|
||||||
|
zoom = 1;
|
||||||
|
|
||||||
|
timeVisible = false;
|
||||||
|
|
||||||
|
relevantChange = true;
|
||||||
|
|
||||||
|
setDoubleBuffered(true);
|
||||||
|
|
||||||
|
topPane = new JViewport();
|
||||||
|
topPane.add(new TopPane());
|
||||||
|
leftPane = new JViewport();
|
||||||
|
leftPane.add(new Leftpane());
|
||||||
|
|
||||||
|
addMouseListener(new MouseAdapter() {
|
||||||
|
@Override
|
||||||
|
public void mouseClicked(MouseEvent e) {
|
||||||
|
switch (e.getButton()){
|
||||||
|
case MouseEvent.BUTTON1:
|
||||||
|
if (e.getClickCount()==1){
|
||||||
|
DateTime dt = getDateTimeAt(e.getPoint().x);
|
||||||
|
IGanttResource r = getResourceAt(e.getPoint().y);
|
||||||
|
IGanttObject o = null;
|
||||||
|
if (r != null)
|
||||||
|
o = getObjectAt(r, dt);
|
||||||
|
|
||||||
|
fireGanttMouseClick(JGantt.this, r, dt, o);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
addGanttMouseListener(new GanttMouseEventListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseClick(JGantt gantt, IGanttResource ganttResource,
|
||||||
|
DateTime dateTime, IGanttObject ganttObject) {
|
||||||
|
setSelectedObject(ganttObject);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addGanttMouseListener(GanttMouseEventListener listener){
|
||||||
|
ganttMouseEventListener.add(listener);
|
||||||
|
}
|
||||||
|
public void removeGanttMouseListener(GanttMouseEventListener listener){
|
||||||
|
ganttMouseEventListener.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fireGanttMouseClick(JGantt gantt,IGanttResource ganttResource,DateTime dateTime,IGanttObject ganttObject){
|
||||||
|
for (GanttMouseEventListener listener: ganttMouseEventListener){
|
||||||
|
listener.mouseClick(this, ganttResource, dateTime, ganttObject);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
public int getZoom() {
|
||||||
|
return zoom;
|
||||||
|
}
|
||||||
|
public void setZoom(int zoom) {
|
||||||
|
this.zoom = zoom;
|
||||||
|
relevantChange = true;
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addGanttObject(IGanttObject object){
|
||||||
|
if (!this.ganttObjects.contains(object)){
|
||||||
|
this.ganttObjects.add(object);
|
||||||
|
|
||||||
|
if (IGanttDrawable.class.isInstance(object)){
|
||||||
|
ganttDrawables.add((IGanttDrawable)object);
|
||||||
|
}
|
||||||
|
|
||||||
|
resolver.leftOptimize(object);
|
||||||
|
object.addNotify(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (IGanttResource res: object.getResources()){
|
||||||
|
addGanttResource(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
public void removeGanttObject(IGanttObject object){
|
||||||
|
if (this.ganttObjects.contains(object)){
|
||||||
|
this.ganttObjects.remove(object);
|
||||||
|
|
||||||
|
if (this.ganttDrawables.contains(object)){
|
||||||
|
this.ganttDrawables.remove(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
object.removeNotify(this);
|
||||||
|
}
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
public IGanttObject[] getGanttObjects(){
|
||||||
|
return this.ganttObjects.toArray(new IGanttObject[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addGanttResource(IGanttResource resource){
|
||||||
|
if (!this.ganttResources.contains(resource))
|
||||||
|
this.ganttResources.add(resource);
|
||||||
|
}
|
||||||
|
public void removeGanttResource(IGanttResource resource){
|
||||||
|
this.ganttResources.remove(resource);
|
||||||
|
}
|
||||||
|
public IGanttResource[] getGanttResources(){
|
||||||
|
return this.ganttResources.toArray(new IGanttResource[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getFirstDate() {
|
||||||
|
return new Date(firstDate);
|
||||||
|
}
|
||||||
|
public void setFirstDate(Date firstDate) {
|
||||||
|
this.firstDate = new Date(firstDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDays() {
|
||||||
|
return days;
|
||||||
|
}
|
||||||
|
public void setDays(int days) {
|
||||||
|
this.days = days;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTimeVisible(boolean timeVisible) {
|
||||||
|
this.timeVisible = timeVisible;
|
||||||
|
}
|
||||||
|
public boolean isTimeVisible(){
|
||||||
|
return this.timeVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IGanttObject getSelectedObject() {
|
||||||
|
return selectedObject;
|
||||||
|
}
|
||||||
|
public void setSelectedObject(IGanttObject selectedObject) {
|
||||||
|
this.selectedObject = selectedObject;
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IGanttObject findObjectAt(IGanttResource resource,DateTime dateTime){
|
||||||
|
System.err.println(String.format("JGantt: Find Object on Resource %s at %s",resource.toString(),dateTime.toString()));
|
||||||
|
|
||||||
|
for (IGanttObject o: ganttObjects){
|
||||||
|
if (o.getStartTime().isBefore(dateTime) && o.getEndTime().isAfter(dateTime) && Arrays.asList(o.getResources()).contains(resource)){
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IGanttResource getResourceAt(int y){
|
||||||
|
if (y > minHeight)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
IGanttResource res = ganttResources.get((y-6) / lineHeight);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DateTime getDateTimeAt(int x){
|
||||||
|
Date date = new Date(firstDate);
|
||||||
|
date.addDays(x / dayColumnWidth);
|
||||||
|
TimeOfDay time = new TimeOfDay( TimeOfDay.SECONDSPERDAY * (x % dayColumnWidth) / dayColumnWidth );
|
||||||
|
return new DateTime(date, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
private IGanttObject getObjectAt(IGanttResource resource,DateTime dateTime){
|
||||||
|
IGanttObject o = findObjectAt(resource,dateTime);
|
||||||
|
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IGanttObject[] findParallelObjects(IGanttObject object,IGanttResource resource){
|
||||||
|
LinkedList<IGanttObject> rl = new LinkedList<IGanttObject>();
|
||||||
|
|
||||||
|
/* for (IGanttObject o:ganttObjects)
|
||||||
|
if (Arrays.asList(o.getResources()).contains(o)
|
||||||
|
*/
|
||||||
|
return rl.toArray(new IGanttObject[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IGanttObject[] findDependedObjects(IGanttObject object){
|
||||||
|
LinkedList<IGanttObject> rl = new LinkedList<IGanttObject>();
|
||||||
|
|
||||||
|
for (IGanttObject o:ganttObjects)
|
||||||
|
if (Arrays.asList(o.getDependencies()).contains(object))
|
||||||
|
rl.add(o);
|
||||||
|
|
||||||
|
return rl.toArray(new IGanttObject[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IGanttObject[] findDependedObjects(IGanttObject object,IGanttResource resource){
|
||||||
|
LinkedList<IGanttObject> rl = new LinkedList<IGanttObject>();
|
||||||
|
|
||||||
|
for (IGanttObject o:ganttObjects)
|
||||||
|
if (Arrays.asList(o.getDependencies()).contains(object) && Arrays.asList(o.getResources()).contains(resource))
|
||||||
|
rl.add(o);
|
||||||
|
|
||||||
|
return rl.toArray(new IGanttObject[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********
|
||||||
|
* Layout variables...
|
||||||
|
*/
|
||||||
|
|
||||||
|
int resourceLines;
|
||||||
|
int lineHeight,
|
||||||
|
headerLineHeight;
|
||||||
|
int resourceBaseHeight;
|
||||||
|
|
||||||
|
int leftColumnWidth;
|
||||||
|
|
||||||
|
int dayColumnWidth;
|
||||||
|
|
||||||
|
int minHeight;
|
||||||
|
int minWidth;
|
||||||
|
|
||||||
|
void paintObject(Graphics2D g,Rectangle rect,IGanttObject object){
|
||||||
|
|
||||||
|
if (ganttDrawables.contains(object)){
|
||||||
|
((IGanttDrawable)object).paint(g, rect);
|
||||||
|
} else {
|
||||||
|
if (selectedObject == object)
|
||||||
|
g.setColor(Color.RED);
|
||||||
|
else
|
||||||
|
g.setColor(new Color(255,192,192));
|
||||||
|
|
||||||
|
g.fillRoundRect(rect.x,rect.y,rect.width,rect.height, 8, 8);
|
||||||
|
g.drawRoundRect(rect.x,rect.y,rect.width,rect.height, 8, 8);
|
||||||
|
|
||||||
|
if (selectedObject == object)
|
||||||
|
g.setColor(Color.WHITE);
|
||||||
|
else
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
|
||||||
|
g.drawString(object.getShortLabel(), rect.x + 4, rect.y + lineHeight - 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void paint(Graphics _g) {
|
||||||
|
Graphics2D g = (Graphics2D)_g;
|
||||||
|
|
||||||
|
int n;
|
||||||
|
|
||||||
|
updateSizes();
|
||||||
|
|
||||||
|
g.setColor(getBackground());
|
||||||
|
g.fillRect(0, 0, getWidth(), getHeight());
|
||||||
|
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
// g.drawLine(leftColumnWidth, 0, leftColumnWidth, getHeight());
|
||||||
|
|
||||||
|
Date lastDate = getFirstDate();
|
||||||
|
lastDate.addDays(days-1);
|
||||||
|
|
||||||
|
|
||||||
|
for (n = 0; n < days; n++){
|
||||||
|
int l = ((n) * dayColumnWidth);
|
||||||
|
|
||||||
|
g.drawLine(((n+1) * dayColumnWidth), 0, ((n+1) * dayColumnWidth), minHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
n = 0;
|
||||||
|
for (IGanttResource resource: this.ganttResources){
|
||||||
|
n += resource.getMaxParallelUsage();
|
||||||
|
|
||||||
|
g.setColor(Color.LIGHT_GRAY);
|
||||||
|
|
||||||
|
g.drawLine(0, 4 + (n * lineHeight), minWidth, 4 + (n * lineHeight));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (IGanttObject object: ganttObjects){
|
||||||
|
if (object.getEndTime().getDate().isBefore(firstDate) || object.getStartTime().getDate().isAfter(lastDate))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int pos = 2 + (object.getStartTime().getDate().daysAfter(firstDate) * dayColumnWidth);
|
||||||
|
int width = (object.getEndTime().getDate().daysAfter(object.getStartTime().getDate()) * dayColumnWidth) + dayColumnWidth - 4;
|
||||||
|
int posOffset = dayColumnWidth * object.getStartTime().getTime().getSecondsOfTheDay() / TimeOfDay.SECONDSPERDAY;
|
||||||
|
|
||||||
|
pos += posOffset;
|
||||||
|
width -= posOffset + dayColumnWidth * (TimeOfDay.SECONDSPERDAY - object.getEndTime().getTime().getSecondsOfTheDay()) / TimeOfDay.SECONDSPERDAY;
|
||||||
|
|
||||||
|
for (IGanttResource res: object.getResources()){
|
||||||
|
int vpos = 6 + (ganttResources.indexOf(res) * lineHeight);
|
||||||
|
|
||||||
|
Rectangle rect = new Rectangle(pos, vpos, width, lineHeight - 4);
|
||||||
|
paintObject(g, rect, object);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void updateSizes(){
|
||||||
|
if (!relevantChange)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Graphics2D g = (Graphics2D)getGraphics();
|
||||||
|
FontMetrics fm = getFontMetrics(getFont());
|
||||||
|
|
||||||
|
//lineHeight = (int)(getFont().getSize2D()*72) + 4;
|
||||||
|
lineHeight = getFont().getSize() + 8;
|
||||||
|
headerLineHeight = getFont().getSize() + 2;
|
||||||
|
|
||||||
|
resourceBaseHeight = headerLineHeight * 4;
|
||||||
|
|
||||||
|
if (isTimeVisible())
|
||||||
|
dayColumnWidth = 96;
|
||||||
|
else
|
||||||
|
dayColumnWidth = ((int)fm.getStringBounds("WWW", g).getWidth()) + 10;
|
||||||
|
|
||||||
|
dayColumnWidth *= zoom;
|
||||||
|
|
||||||
|
resourceLines = 0;
|
||||||
|
leftColumnWidth = 0;
|
||||||
|
for (IGanttResource resource: this.ganttResources){
|
||||||
|
int lw = (int)fm.getStringBounds(resource.getLabel(), g).getWidth();
|
||||||
|
|
||||||
|
if (lw > leftColumnWidth)
|
||||||
|
leftColumnWidth = lw;
|
||||||
|
|
||||||
|
resourceLines += resource.getMaxParallelUsage();
|
||||||
|
}
|
||||||
|
|
||||||
|
leftColumnWidth += 15;
|
||||||
|
|
||||||
|
|
||||||
|
minHeight = 4 + (lineHeight * resourceLines);
|
||||||
|
minWidth = ( dayColumnWidth * days );
|
||||||
|
|
||||||
|
setPreferredSize(new Dimension(minWidth, minHeight));
|
||||||
|
|
||||||
|
leftPane.setSize(new Dimension(leftColumnWidth,minHeight));
|
||||||
|
topPane.setSize(new Dimension(minWidth, resourceBaseHeight));
|
||||||
|
|
||||||
|
relevantChange = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class TopPane extends JComponent {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension getPreferredSize() {
|
||||||
|
return new Dimension(minWidth,resourceBaseHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void paint(Graphics _g) {
|
||||||
|
Graphics2D g = (Graphics2D)_g;
|
||||||
|
|
||||||
|
int n;
|
||||||
|
int ayear = 0;
|
||||||
|
int aweek = 0;
|
||||||
|
|
||||||
|
updateSizes();
|
||||||
|
|
||||||
|
g.setColor(getBackground());
|
||||||
|
g.fillRect(0, 0, getWidth(), getHeight());
|
||||||
|
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
// g.drawLine(leftColumnWidth, 0, leftColumnWidth, getHeight());
|
||||||
|
|
||||||
|
g.drawLine(0, resourceBaseHeight, getWidth(), resourceBaseHeight);
|
||||||
|
g.drawLine(0, headerLineHeight, minWidth, headerLineHeight);
|
||||||
|
g.drawLine(0, 2 * headerLineHeight, minWidth, 2 * headerLineHeight);
|
||||||
|
|
||||||
|
Date date = getFirstDate();
|
||||||
|
|
||||||
|
for (n = 0; n < days; n++){
|
||||||
|
int l = ((n) * dayColumnWidth);
|
||||||
|
|
||||||
|
g.drawLine(((n+1) * dayColumnWidth), resourceBaseHeight - (2 * headerLineHeight), ((n+1) * dayColumnWidth), resourceBaseHeight * 4);
|
||||||
|
|
||||||
|
g.drawString(String.format("%02d.%02d", date.getDay(),date.getMonth()), l + 2, resourceBaseHeight - headerLineHeight - 2);
|
||||||
|
g.drawString(String.format("%s", date.weekdays[date.getWeekDay()]), l + 2, resourceBaseHeight - 2);
|
||||||
|
|
||||||
|
if (ayear != date.getYear()){
|
||||||
|
g.drawString(String.format("%02d", date.getYear()), l + 2, resourceBaseHeight - (3 * headerLineHeight) - 2);
|
||||||
|
if (ayear != 0){
|
||||||
|
g.drawLine(((n) * dayColumnWidth), resourceBaseHeight - (4 * headerLineHeight), ((n) * dayColumnWidth), resourceBaseHeight - (3 * headerLineHeight));
|
||||||
|
}
|
||||||
|
ayear = date.getYear();
|
||||||
|
}
|
||||||
|
|
||||||
|
int w = date.getWeek();
|
||||||
|
|
||||||
|
if (aweek != w){
|
||||||
|
g.drawString(String.format("%02d", w), l + 2, resourceBaseHeight - (2 * headerLineHeight) - 2);
|
||||||
|
if (aweek != 0){
|
||||||
|
g.drawLine(((n) * dayColumnWidth), resourceBaseHeight - (3 * headerLineHeight), ((n) * dayColumnWidth), resourceBaseHeight - (2 * headerLineHeight));
|
||||||
|
}
|
||||||
|
aweek = w;
|
||||||
|
}
|
||||||
|
|
||||||
|
date.addDays(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Leftpane extends JComponent {
|
||||||
|
|
||||||
|
public Leftpane() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension getPreferredSize() {
|
||||||
|
return new Dimension(leftColumnWidth,minHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void paint(Graphics _g) {
|
||||||
|
Graphics2D g = (Graphics2D)_g;
|
||||||
|
|
||||||
|
int n;
|
||||||
|
|
||||||
|
updateSizes();
|
||||||
|
|
||||||
|
g.setColor(getBackground());
|
||||||
|
g.fillRect(0, 0, getWidth(), getHeight());
|
||||||
|
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
g.drawLine(leftColumnWidth - 1, 0, leftColumnWidth - 1, getHeight());
|
||||||
|
|
||||||
|
// g.drawLine(0, 0, getWidth(), 0);
|
||||||
|
|
||||||
|
n = 0;
|
||||||
|
for (IGanttResource resource: ganttResources){
|
||||||
|
n += resource.getMaxParallelUsage();
|
||||||
|
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
g.drawString(resource.getLabel(), 2, 1 + (n * lineHeight));
|
||||||
|
g.setColor(Color.LIGHT_GRAY);
|
||||||
|
|
||||||
|
g.drawLine(0, 4 + (n * lineHeight), getWidth(), 4 + (n * lineHeight));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addNotify() {
|
||||||
|
super.addNotify();
|
||||||
|
|
||||||
|
if (JViewport.class.isInstance(getParent()) && JScrollPane.class.isInstance(getParent().getParent()))
|
||||||
|
{
|
||||||
|
JScrollPane sp = (JScrollPane)getParent().getParent();
|
||||||
|
sp.setColumnHeader(topPane);
|
||||||
|
sp.setRowHeader(leftPane);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void removeNotify() {
|
||||||
|
super.removeNotify();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hwo.ui.netplan;
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
import java.awt.BorderLayout;
|
||||||
import java.awt.FlowLayout;
|
import java.awt.FlowLayout;
|
||||||
|
@ -26,17 +26,17 @@ import org.hwo.datetime.TimeOfDay;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
|
|
||||||
public class JNetPlanTestDialog extends JDialog {
|
public class JGanttTestDialog extends JDialog {
|
||||||
|
|
||||||
private final JPanel contentPanel = new JPanel();
|
private final JPanel contentPanel = new JPanel();
|
||||||
private JNetPlan netPlan;
|
private JGantt netPlan;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the dialog.
|
* Create the dialog.
|
||||||
*/
|
*/
|
||||||
public JNetPlanTestDialog() {
|
public JGanttTestDialog() {
|
||||||
setModal(true);
|
setModal(true);
|
||||||
setTitle("JNetPlan Test Dialog");
|
setTitle("JGantt Test Dialog");
|
||||||
setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
|
setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
|
||||||
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
||||||
setBounds(100, 100, 975, 481);
|
setBounds(100, 100, 975, 481);
|
||||||
|
@ -59,8 +59,8 @@ public class JNetPlanTestDialog extends JDialog {
|
||||||
gbc_scrollPane.gridy = 0;
|
gbc_scrollPane.gridy = 0;
|
||||||
contentPanel.add(scrollPane, gbc_scrollPane);
|
contentPanel.add(scrollPane, gbc_scrollPane);
|
||||||
{
|
{
|
||||||
netPlan = new JNetPlan();
|
netPlan = new JGantt();
|
||||||
netPlan.setDays(45);
|
netPlan.setDays(230);
|
||||||
netPlan.setFont(new Font("DejaVu Sans", Font.PLAIN, 16));
|
netPlan.setFont(new Font("DejaVu Sans", Font.PLAIN, 16));
|
||||||
netPlan.setBackground(Color.WHITE);
|
netPlan.setBackground(Color.WHITE);
|
||||||
scrollPane.setViewportView(netPlan);
|
scrollPane.setViewportView(netPlan);
|
||||||
|
@ -94,8 +94,8 @@ public class JNetPlanTestDialog extends JDialog {
|
||||||
|
|
||||||
private void initialize(){
|
private void initialize(){
|
||||||
for (int i=0;i<10;i++){
|
for (int i=0;i<10;i++){
|
||||||
BaseNetPlanResource res = new BaseNetPlanResource(String.format("Resource %d",i), "-");
|
BaseGanttResource res = new BaseGanttResource(String.format("Resource %d",i), "-");
|
||||||
netPlan.addNetPlanResource(res);
|
netPlan.addGanttResource(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
Date d = new Date();
|
Date d = new Date();
|
||||||
|
@ -105,17 +105,38 @@ public class JNetPlanTestDialog extends JDialog {
|
||||||
Date d2 = new Date(d);
|
Date d2 = new Date(d);
|
||||||
d2.addDays(4);
|
d2.addDays(4);
|
||||||
|
|
||||||
BaseNetPlanObject o = new BaseNetPlanObject();
|
BaseGanttObject o = new BaseGanttObject();
|
||||||
o.setStartTime(new DateTime(d, new TimeOfDay()));
|
o.setStartTime(new DateTime(d, new TimeOfDay()));
|
||||||
o.setEndTime(new DateTime(d2, TimeOfDay.beforeMidnight()));
|
o.setEndTime(new DateTime(d2, TimeOfDay.beforeMidnight()));
|
||||||
|
|
||||||
o.setShortLabel("Eine Aufgabe");
|
o.setShortLabel("Eine Aufgabe");
|
||||||
o.addResource(netPlan.getNetPlanResources()[0]);
|
o.addResource(netPlan.getGanttResources()[0]);
|
||||||
o.addResource(netPlan.getNetPlanResources()[3]);
|
o.addResource(netPlan.getGanttResources()[3]);
|
||||||
o.addResource(netPlan.getNetPlanResources()[7]);
|
o.addResource(netPlan.getGanttResources()[7]);
|
||||||
|
netPlan.addGanttObject(o);
|
||||||
|
|
||||||
netPlan.addNetPlanObject(o);
|
d.addDays(2);
|
||||||
|
d2.addDays(6);
|
||||||
|
|
||||||
|
o = new BaseGanttObject();
|
||||||
|
o.setStartTime(new DateTime(d, new TimeOfDay()));
|
||||||
|
o.setEndTime(new DateTime(d2, TimeOfDay.beforeMidnight()));
|
||||||
|
o.setShortLabel("Eine Aufgabe");
|
||||||
|
o.addResource(netPlan.getGanttResources()[1]);
|
||||||
|
o.addResource(netPlan.getGanttResources()[2]);
|
||||||
|
netPlan.addGanttObject(o);
|
||||||
|
|
||||||
|
d.addDays(3);
|
||||||
|
d2.addDays(-2);
|
||||||
|
|
||||||
|
o = new BaseGanttObject();
|
||||||
|
o.setStartTime(new DateTime(d, new TimeOfDay()));
|
||||||
|
o.setEndTime(new DateTime(d2, TimeOfDay.beforeMidnight()));
|
||||||
|
o.setShortLabel("Eine Aufgabe");
|
||||||
|
o.addResource(netPlan.getGanttResources()[0]);
|
||||||
|
o.addResource(netPlan.getGanttResources()[7]);
|
||||||
|
netPlan.addGanttObject(o);
|
||||||
|
|
||||||
|
//netPlan.setSelectedObject(o);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hwo.ui.netplan;
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
import org.hwo.datetime.Date;
|
import org.hwo.datetime.Date;
|
||||||
import org.hwo.datetime.DateTime;
|
import org.hwo.datetime.DateTime;
|
||||||
|
@ -142,6 +142,13 @@ public class ResourceAvailability {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getSeconds(){
|
||||||
|
return startTime.secondsBefore(endTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSeconds(DateTime from){
|
||||||
|
return from.secondsBefore(endTime);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
@ -149,7 +156,7 @@ public class ResourceAvailability {
|
||||||
|
|
||||||
ResourceAvailability ra = this;
|
ResourceAvailability ra = this;
|
||||||
while (ra != null){
|
while (ra != null){
|
||||||
sb.append(String.format("%s %s - %s %s\n",Date.weekdays[ra.getStartTime().getDate().getWeekDay()],ra.getStartTime().toString(),Date.weekdays[ra.getEndTime().getDate().getWeekDay()],ra.getEndTime().toString()));
|
sb.append(String.format("%s %s - %s %s (%d seconds)\n",Date.weekdays[ra.getStartTime().getDate().getWeekDay()],ra.getStartTime().toString(),Date.weekdays[ra.getEndTime().getDate().getWeekDay()],ra.getEndTime().toString(),ra.getSeconds()));
|
||||||
ra = ra.getNext();
|
ra = ra.getNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,19 +168,27 @@ public class ResourceAvailability {
|
||||||
return generateWeekly(from, days, available,new TimeOfDay(),TimeOfDay.beforeMidnight());
|
return generateWeekly(from, days, available,new TimeOfDay(),TimeOfDay.beforeMidnight());
|
||||||
}
|
}
|
||||||
public static ResourceAvailability generateWeekly(Date from,int days,boolean[] available,TimeOfDay timeStart,TimeOfDay timeEnd){
|
public static ResourceAvailability generateWeekly(Date from,int days,boolean[] available,TimeOfDay timeStart,TimeOfDay timeEnd){
|
||||||
|
Date to;
|
||||||
|
|
||||||
from.addDays(-1);
|
from.addDays(-1);
|
||||||
ResourceAvailability head = new ResourceAvailability(new DateTime(from, new TimeOfDay()));
|
ResourceAvailability head = new ResourceAvailability(new DateTime(from, new TimeOfDay()));
|
||||||
head.setEndTime(new DateTime(from, TimeOfDay.beforeMidnight()));
|
head.setEndTime(new DateTime(from, TimeOfDay.beforeMidnight()));
|
||||||
|
|
||||||
for (int i=0;i<days;i++){
|
|
||||||
from.addDays(1);
|
from.addDays(1);
|
||||||
|
|
||||||
|
for (int i=0;i<days;i++){
|
||||||
DateTime aStart = new DateTime(from, timeStart);
|
DateTime aStart = new DateTime(from, timeStart);
|
||||||
DateTime aEnd = new DateTime(from, timeEnd);
|
|
||||||
|
to = new Date(from);
|
||||||
|
if (timeEnd.isEarlierThan(timeStart))
|
||||||
|
to.addDays(1);
|
||||||
|
|
||||||
|
DateTime aEnd = new DateTime(to, timeEnd);
|
||||||
|
|
||||||
if (available[from.getWeekDay()])
|
if (available[from.getWeekDay()])
|
||||||
head.makeAvailable(aStart, aEnd, Date.weekdays[from.getWeekDay()]);
|
head.makeAvailable(aStart, aEnd, Date.weekdays[from.getWeekDay()]);
|
||||||
|
|
||||||
|
from.addDays(1);
|
||||||
}
|
}
|
||||||
return head.getNext();
|
return head.getNext();
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hwo.ui.netplan;
|
package org.hwo.ui.gantt;
|
||||||
|
|
||||||
import java.io.Console;
|
import java.io.Console;
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ import org.hwo.datetime.Date;
|
||||||
import org.hwo.datetime.DateTime;
|
import org.hwo.datetime.DateTime;
|
||||||
import org.hwo.datetime.TimeOfDay;
|
import org.hwo.datetime.TimeOfDay;
|
||||||
|
|
||||||
public class TestNetPlan {
|
public class TestGantt {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ public class TestNetPlan {
|
||||||
|
|
||||||
System.err.println(ra.toString());
|
System.err.println(ra.toString());
|
||||||
|
|
||||||
JNetPlanTestDialog dialog = new JNetPlanTestDialog();
|
JGanttTestDialog dialog = new JGanttTestDialog();
|
||||||
|
|
||||||
dialog.setVisible(true);
|
dialog.setVisible(true);
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
package org.hwo.ui.netplan;
|
|
||||||
|
|
||||||
import org.hwo.datetime.DateTime;
|
|
||||||
|
|
||||||
public class BaseNetPlanResource implements INetPlanResource {
|
|
||||||
|
|
||||||
private String shortLabel;
|
|
||||||
private String detailedLabel;
|
|
||||||
private int maxParallelUsage;
|
|
||||||
|
|
||||||
private ResourceAvailability resourceAvailability;
|
|
||||||
|
|
||||||
public BaseNetPlanResource(String shortLabel,String detailedLabel) {
|
|
||||||
this.shortLabel = shortLabel;
|
|
||||||
this.detailedLabel = detailedLabel;
|
|
||||||
this.maxParallelUsage = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getLabel() {
|
|
||||||
return this.shortLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDetailedLabel() {
|
|
||||||
return this.detailedLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ResourceAvailability getAvailability() {
|
|
||||||
return resourceAvailability;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ResourceAvailability getAvailability(DateTime fromDateTime) {
|
|
||||||
return resourceAvailability.findAvailableAfter(fromDateTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMaxParallelUsage() {
|
|
||||||
return this.maxParallelUsage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMaxParallelUsage(int maxParallelUsage) {
|
|
||||||
this.maxParallelUsage = maxParallelUsage;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,346 +0,0 @@
|
||||||
package org.hwo.ui.netplan;
|
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.FontMetrics;
|
|
||||||
import java.awt.Graphics;
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.Rectangle;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JScrollPane;
|
|
||||||
import javax.swing.JViewport;
|
|
||||||
import javax.swing.Scrollable;
|
|
||||||
import javax.swing.SwingConstants;
|
|
||||||
|
|
||||||
import org.hwo.datetime.Date;
|
|
||||||
|
|
||||||
public class JNetPlan extends JComponent {
|
|
||||||
|
|
||||||
List<INetPlanObject> netPlanObjects;
|
|
||||||
List<INetPlanResource> netPlanResources;
|
|
||||||
|
|
||||||
Date firstDate;
|
|
||||||
int days;
|
|
||||||
|
|
||||||
boolean timeVisible;
|
|
||||||
|
|
||||||
|
|
||||||
boolean relevantChange;
|
|
||||||
|
|
||||||
JViewport topPane,
|
|
||||||
leftPane;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public JNetPlan() {
|
|
||||||
netPlanObjects = new ArrayList<INetPlanObject>();
|
|
||||||
netPlanResources = new ArrayList<INetPlanResource>();
|
|
||||||
|
|
||||||
firstDate = new Date();
|
|
||||||
days = 31;
|
|
||||||
|
|
||||||
timeVisible = false;
|
|
||||||
|
|
||||||
relevantChange = true;
|
|
||||||
|
|
||||||
setDoubleBuffered(true);
|
|
||||||
|
|
||||||
topPane = new JViewport();
|
|
||||||
topPane.add(new TopPane());
|
|
||||||
leftPane = new JViewport();
|
|
||||||
leftPane.add(new Leftpane());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addNetPlanObject(INetPlanObject object){
|
|
||||||
if (!this.netPlanObjects.contains(object))
|
|
||||||
this.netPlanObjects.add(object);
|
|
||||||
|
|
||||||
for (INetPlanResource res: object.getResources()){
|
|
||||||
addNetPlanResource(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void removeNetPlanObject(INetPlanObject object){
|
|
||||||
this.netPlanObjects.remove(object);
|
|
||||||
}
|
|
||||||
public INetPlanObject[] getNetPlanObjects(){
|
|
||||||
return this.netPlanObjects.toArray(new INetPlanObject[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addNetPlanResource(INetPlanResource resource){
|
|
||||||
if (!this.netPlanResources.contains(resource))
|
|
||||||
this.netPlanResources.add(resource);
|
|
||||||
}
|
|
||||||
public void removeNetPlanResource(INetPlanResource resource){
|
|
||||||
this.netPlanResources.remove(resource);
|
|
||||||
}
|
|
||||||
public INetPlanResource[] getNetPlanResources(){
|
|
||||||
return this.netPlanResources.toArray(new INetPlanResource[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Date getFirstDate() {
|
|
||||||
return new Date(firstDate);
|
|
||||||
}
|
|
||||||
public void setFirstDate(Date firstDate) {
|
|
||||||
this.firstDate = new Date(firstDate);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getDays() {
|
|
||||||
return days;
|
|
||||||
}
|
|
||||||
public void setDays(int days) {
|
|
||||||
this.days = days;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTimeVisible(boolean timeVisible) {
|
|
||||||
this.timeVisible = timeVisible;
|
|
||||||
}
|
|
||||||
public boolean isTimeVisible(){
|
|
||||||
return this.timeVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********
|
|
||||||
* Layout variables...
|
|
||||||
*/
|
|
||||||
|
|
||||||
int resourceLines;
|
|
||||||
int lineHeight;
|
|
||||||
int resourceBaseHeight;
|
|
||||||
|
|
||||||
int leftColumnWidth;
|
|
||||||
|
|
||||||
int dayColumnWidth;
|
|
||||||
|
|
||||||
int minHeight;
|
|
||||||
int minWidth;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void paint(Graphics _g) {
|
|
||||||
Graphics2D g = (Graphics2D)_g;
|
|
||||||
|
|
||||||
int n;
|
|
||||||
|
|
||||||
updateSizes();
|
|
||||||
|
|
||||||
g.setColor(getBackground());
|
|
||||||
g.fillRect(0, 0, getWidth(), getHeight());
|
|
||||||
|
|
||||||
g.setColor(Color.BLACK);
|
|
||||||
// g.drawLine(leftColumnWidth, 0, leftColumnWidth, getHeight());
|
|
||||||
|
|
||||||
Date date = getFirstDate();
|
|
||||||
|
|
||||||
for (n = 0; n < days; n++){
|
|
||||||
int l = ((n) * dayColumnWidth);
|
|
||||||
|
|
||||||
g.drawLine(((n+1) * dayColumnWidth), 0, ((n+1) * dayColumnWidth), minHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
n = 0;
|
|
||||||
for (INetPlanResource resource: this.netPlanResources){
|
|
||||||
n += resource.getMaxParallelUsage();
|
|
||||||
|
|
||||||
g.setColor(Color.LIGHT_GRAY);
|
|
||||||
|
|
||||||
g.drawLine(0, 4 + (n * lineHeight), minWidth, 4 + (n * lineHeight));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (INetPlanObject object: netPlanObjects){
|
|
||||||
int pos = 2 + (object.getStartTime().getDate().daysAfter(firstDate) * dayColumnWidth);
|
|
||||||
int width = (object.getEndTime().getDate().daysAfter(object.getStartTime().getDate()) * dayColumnWidth) + dayColumnWidth - 4;
|
|
||||||
|
|
||||||
for (INetPlanResource res: object.getResources()){
|
|
||||||
int vpos = 6 + (netPlanResources.indexOf(res) * lineHeight);
|
|
||||||
g.setColor(Color.RED);
|
|
||||||
g.fillRoundRect(pos, vpos, width, lineHeight - 4, 8, 8);
|
|
||||||
g.drawRoundRect(pos, vpos, width, lineHeight - 4, 8, 8);
|
|
||||||
g.setColor(Color.WHITE);
|
|
||||||
g.drawString(object.getShortLabel(), pos + 4, vpos + lineHeight - 8);
|
|
||||||
|
|
||||||
//System.err.println(String.format("[%d/%d] [%d/%d]",pos,vpos,width,lineHeight - 4));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void updateSizes(){
|
|
||||||
if (!relevantChange)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Graphics2D g = (Graphics2D)getGraphics();
|
|
||||||
FontMetrics fm = getFontMetrics(getFont());
|
|
||||||
|
|
||||||
//lineHeight = (int)(getFont().getSize2D()*72) + 4;
|
|
||||||
lineHeight = getFont().getSize() + 8;
|
|
||||||
|
|
||||||
resourceBaseHeight = lineHeight * 3;
|
|
||||||
|
|
||||||
if (isTimeVisible())
|
|
||||||
dayColumnWidth = 96;
|
|
||||||
else
|
|
||||||
dayColumnWidth = ((int)fm.getStringBounds("WWW", g).getWidth()) + 10;
|
|
||||||
|
|
||||||
resourceLines = 0;
|
|
||||||
leftColumnWidth = 0;
|
|
||||||
for (INetPlanResource resource: this.netPlanResources){
|
|
||||||
int lw = (int)fm.getStringBounds(resource.getLabel(), g).getWidth();
|
|
||||||
|
|
||||||
if (lw > leftColumnWidth)
|
|
||||||
leftColumnWidth = lw;
|
|
||||||
|
|
||||||
resourceLines += resource.getMaxParallelUsage();
|
|
||||||
}
|
|
||||||
|
|
||||||
leftColumnWidth += 5;
|
|
||||||
|
|
||||||
|
|
||||||
minHeight = 4 + (lineHeight * resourceLines);
|
|
||||||
minWidth = ( dayColumnWidth * days );
|
|
||||||
|
|
||||||
setPreferredSize(new Dimension(minWidth, minHeight));
|
|
||||||
|
|
||||||
leftPane.setSize(new Dimension(leftColumnWidth,minHeight));
|
|
||||||
topPane.setSize(new Dimension(minWidth, 4 * lineHeight));
|
|
||||||
|
|
||||||
relevantChange = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class TopPane extends JComponent {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Dimension getPreferredSize() {
|
|
||||||
return new Dimension(minWidth,4 * lineHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void paint(Graphics _g) {
|
|
||||||
Graphics2D g = (Graphics2D)_g;
|
|
||||||
|
|
||||||
int n;
|
|
||||||
|
|
||||||
updateSizes();
|
|
||||||
|
|
||||||
g.setColor(getBackground());
|
|
||||||
g.fillRect(0, 0, getWidth(), getHeight());
|
|
||||||
|
|
||||||
g.setColor(Color.BLACK);
|
|
||||||
// g.drawLine(leftColumnWidth, 0, leftColumnWidth, getHeight());
|
|
||||||
|
|
||||||
g.drawLine(0, resourceBaseHeight, getWidth(), resourceBaseHeight);
|
|
||||||
|
|
||||||
Date date = getFirstDate();
|
|
||||||
|
|
||||||
for (n = 0; n < days; n++){
|
|
||||||
int l = ((n) * dayColumnWidth);
|
|
||||||
|
|
||||||
g.drawLine(((n+1) * dayColumnWidth), resourceBaseHeight - (2 * lineHeight), ((n+1) * dayColumnWidth), minHeight);
|
|
||||||
|
|
||||||
g.drawString(String.format("%d", date.getDay()), l + 2, resourceBaseHeight - lineHeight - 2);
|
|
||||||
g.drawString(String.format("%s", date.weekdays[date.getWeekDay()]), l + 2, resourceBaseHeight - 2);
|
|
||||||
|
|
||||||
date.addDays(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Leftpane extends JComponent {
|
|
||||||
|
|
||||||
public Leftpane() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Dimension getPreferredSize() {
|
|
||||||
return new Dimension(leftColumnWidth,minHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void paint(Graphics _g) {
|
|
||||||
Graphics2D g = (Graphics2D)_g;
|
|
||||||
|
|
||||||
int n;
|
|
||||||
|
|
||||||
updateSizes();
|
|
||||||
|
|
||||||
g.setColor(getBackground());
|
|
||||||
g.fillRect(0, 0, getWidth(), getHeight());
|
|
||||||
|
|
||||||
g.setColor(Color.BLACK);
|
|
||||||
// g.drawLine(leftColumnWidth, 0, leftColumnWidth, getHeight());
|
|
||||||
|
|
||||||
// g.drawLine(0, 0, getWidth(), 0);
|
|
||||||
|
|
||||||
n = 0;
|
|
||||||
for (INetPlanResource resource: netPlanResources){
|
|
||||||
n += resource.getMaxParallelUsage();
|
|
||||||
|
|
||||||
g.setColor(Color.BLACK);
|
|
||||||
g.drawString(resource.getLabel(), 2, 1 + (n * lineHeight));
|
|
||||||
g.setColor(Color.LIGHT_GRAY);
|
|
||||||
|
|
||||||
g.drawLine(0, 4 + (n * lineHeight), getWidth(), 4 + (n * lineHeight));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
@Override
|
|
||||||
public Dimension getPreferredScrollableViewportSize() {
|
|
||||||
return getPreferredSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getScrollableBlockIncrement(Rectangle visibleRect,
|
|
||||||
int orientation, int direction) {
|
|
||||||
if (orientation == SwingConstants.HORIZONTAL)
|
|
||||||
return visibleRect.width / 2;
|
|
||||||
else
|
|
||||||
return visibleRect.height / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean getScrollableTracksViewportHeight() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean getScrollableTracksViewportWidth() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getScrollableUnitIncrement(Rectangle visibleRect,
|
|
||||||
int orientation, int direction) {
|
|
||||||
if (orientation == SwingConstants.HORIZONTAL)
|
|
||||||
return 10;
|
|
||||||
else
|
|
||||||
return lineHeight;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void addNotify() {
|
|
||||||
super.addNotify();
|
|
||||||
|
|
||||||
if (JViewport.class.isInstance(getParent()) && JScrollPane.class.isInstance(getParent().getParent()))
|
|
||||||
{
|
|
||||||
JScrollPane sp = (JScrollPane)getParent().getParent();
|
|
||||||
sp.setColumnHeader(topPane);
|
|
||||||
sp.setRowHeader(leftPane);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void removeNotify() {
|
|
||||||
super.removeNotify();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
package org.hwo.ui.netplan;
|
|
||||||
|
|
||||||
public class NetPlanException extends Exception {
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue