import java.io.*; import java.lang.System; import java.util.*; import javax.swing.*; import javax.swing.border.CompoundBorder; import javax.swing.table.TableColumn; import java.awt.*; import java.awt.event.*; public class TimeCount implements ActionListener, ItemListener { JPanel bedienfeld; JButton start, pause, stop; CompoundBorder buttonBorder = BorderFactory.createCompoundBorder((BorderFactory.createRaisedBevelBorder()),(BorderFactory.createEmptyBorder(10,10,10,10))); CompoundBorder lowButtonBorder = BorderFactory.createCompoundBorder((BorderFactory.createLoweredBevelBorder()),(BorderFactory.createEmptyBorder(10,10,10,10))); JComboBox projektAuswahl; JFrame frame; Container hg; JMenu menue; JMenuBar menueBar; JMenuItem menueItem; JLabel zeitAnzeige, startZeitAnzeige, gesamtAnzeige; GregorianCalendar datum; File defaultlog; JTable logTable; JScrollPane scrollPane; String sessionDauer = "0:00:00", startZeit; //Strings für Anzeige String liste; //Inhalt von TimeCount.log String gesamt; //die gesamte Projektdauer als String im Format hh:mm:ss String aktProjekt; // der Name des aktuell gewählten Projekts (wird bei ItemChanged aktualisiert) String anmerkung; javax.swing.Timer timer; boolean timerpause = false, timerruns = false, showlog=false; long dauer; //Stoppuhrzeit long tmp_dauer; //Zwischenzeit bei Pause speichern long akt_zeit, projektDauer, startzeit; MyDialog dialog, dialog1; Vector projektListe, sessionListe, sessions, tableSpalten; JMenu logDateMenue, projektMenue, infoMenue; public static void main (String args[]) { TimeCount anwendung = new TimeCount(); } public TimeCount() { frame = new JFrame("Zeiterfassung"); Toolkit screen = java.awt.Toolkit.getDefaultToolkit(); Dimension screen_size = screen.getScreenSize(); frame.setLocation(screen_size.width-395,screen_size.height - 320); frame.setResizable(false); hg = frame.getContentPane(); hg.setLayout(new BorderLayout()); //Knöpfe hinzufügen start = new JButton("Start"); start.setBorder(buttonBorder); start.addActionListener(this); pause = new JButton("Pause"); pause.setBorder(buttonBorder); pause.addActionListener(this); stop = new JButton("Stop"); stop.setBorder(buttonBorder); stop.addActionListener(this); frame.getRootPane().setDefaultButton(start); //Combo-Box für Projekte projektAuswahl = new JComboBox(); liste = lese("TimeCount"); //TimeCount.log auslesen if(liste!=""){ projektListe = split(liste,"|"); for (int i = 0 ;i < projektListe.size(); i++){ projektAuswahl.addItem(projektListe.elementAt(i).toString());}} // für jedes Projekt ein Item anlegen else projektListe = new Vector(); projektAuswahl.setBorder(BorderFactory.createEmptyBorder(10,0,10,0)); projektAuswahl.addItemListener(this); projektAuswahl.setToolTipText("Hier ein Projekt auswählen"); if(projektAuswahl.getItemCount()>0)aktProjekt = projektAuswahl.getSelectedItem().toString(); //Zeitanzeigen datum = new GregorianCalendar(); JLabel startZeit = new JLabel("Startzeit"); startZeitAnzeige = new JLabel(editLabel(getTime(),4)); JLabel gesamtDauer = new JLabel("Projekt-Dauer"); gesamt = zeitFormat(getProjektDauer(aktProjekt),true); gesamtAnzeige = new JLabel(editLabel(gesamt,4)); JLabel aktDauer = new JLabel("Bisherige Zeit"); zeitAnzeige = new JLabel(editLabel(sessionDauer,7)); Box a = Box.createHorizontalBox(); //Box für Zeitanzeigen Box b = Box.createVerticalBox(); JPanel z = new JPanel(new BorderLayout()); b.add(startZeit); b.add(startZeitAnzeige); b.add(gesamtDauer); b.add(gesamtAnzeige); a.add(b); z.add(aktDauer, "North"); z.add(zeitAnzeige,"Center"); a.add(a.createRigidArea(new Dimension (10,10))); a.add(z); a.add(a.createRigidArea(new Dimension (10,10))); //Box für Knöpfe Box c = Box.createHorizontalBox(); c.add(projektAuswahl); projektAuswahl.setSize(80,10); c.add(c.createRigidArea(new Dimension (10,10))); c.add(start); c.add(c.createRigidArea(new Dimension (10,10))); c.add(pause); c.add(c.createRigidArea(new Dimension (10,10))); c.add(stop); c.add(c.createRigidArea(new Dimension (10,10))); hg.add(c, "Center"); hg.add(a,"North"); hg.add(projektAuswahl,"West"); // Menue-Leiste erstellen menueBar = new JMenuBar(); frame.setJMenuBar(menueBar); menue = new JMenu("Datei"); //Menue hinzufügen menueBar.add(menue); menueItem = new JMenuItem("Beenden"); menueItem.addActionListener(this); menue.add(menueItem); projektMenue = new JMenu("Projekte"); //Menue hinzufügen menueBar.add(projektMenue); menueItem = new JMenuItem("Neues Projekt"); menueItem.addActionListener(this); projektMenue.add(menueItem); menueItem = new JMenuItem("Projekt löschen"); menueItem.addActionListener(this); projektMenue.add(menueItem); menueItem = new JMenuItem("Aktuelles Projekt als Standard"); menueItem.addActionListener(this); projektMenue.add(menueItem); logDateMenue = new JMenu("Log-Datei"); //Menue für Log-Datei menueBar.add(logDateMenue); menueItem = new JMenuItem("Log-Datei anzeigen"); menueItem.addActionListener(this); logDateMenue.add(menueItem); menueItem = new JMenuItem("Log-Datei verbergen"); menueItem.addActionListener(this); logDateMenue.add(menueItem); menueItem = new JMenuItem("Log-Datei löschen"); menueItem.addActionListener(this); logDateMenue.add(menueItem); menue = new JMenu("Log-Datei sichern"); menueItem = new JMenuItem("Für Export nach Excel"); menueItem.addActionListener(this); menue.add(menueItem); menueItem = new JMenuItem("Als Textdatei"); menueItem.addActionListener(this); menue.add(menueItem); logDateMenue.add(menue); infoMenue = new JMenu("Info"); menueBar.add(infoMenue); menueItem = new JMenuItem("Über TimeCount"); menueItem.addActionListener(this); infoMenue.add(menueItem); menueItem = new JMenuItem("Autor"); menueItem.addActionListener(this); infoMenue.add(menueItem); frame.pack(); frame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) {System.exit(0);}}); frame.setVisible(true); timer = new javax.swing.Timer(1000,new ActionListener() { //timer für StoppUhr public void actionPerformed(ActionEvent evt1) { berechneDauer(); projektDauer = dauer + getProjektDauer(projektAuswahl.getSelectedItem().toString()); //ProjektDauer für aktuelles Projekt ermitteln zeitAnzeige.setText(editLabel(sessionDauer,10)); String gesamt = zeitFormat(projektDauer,true); gesamtAnzeige.setText(editLabel(gesamt,4));}}); } /** ermittelt die Dauer seit Startzeit und speichert sie in sessionDauer*/ void berechneDauer(){ akt_zeit = System.currentTimeMillis(); dauer = (akt_zeit - startzeit)/1000; if(timerpause) dauer += tmp_dauer; sessionDauer = zeitFormat(dauer,true); } String zeitFormat(long l, boolean sec){ /**wandelt Sekunden in hh:mm:ss (boolean true)oder hh:mm um */ String stunden, minuten, sekunden, gesamt; sekunden = "" + l % 60; minuten = "" + (l % 3600)/60; stunden = "" + l / 3600; if (l % 60 < 10) sekunden = "0" + sekunden; if ((l % 3600)/60 < 10) minuten = "0" + minuten; if(sec){ gesamt = stunden + ":" + minuten + ":" + sekunden;} else {gesamt = stunden + ":" + minuten;} return gesamt; } public void actionPerformed (ActionEvent evt2){ String input = evt2.getActionCommand(); if(input == "Start"){ start.setBorder(lowButtonBorder); pause.setBorder(buttonBorder); if(projektAuswahl.getItemCount()<1){ neuesProjekt(); start.setBorder(buttonBorder); return;} startzeit = System.currentTimeMillis(); startZeit = getDate(); startZeitAnzeige.setText(editLabel(getTime(),4)); timerruns = true; timer.start(); frame.getRootPane().setDefaultButton(stop); } if (input == "Stop"){ start.setBorder(buttonBorder); pause.setBorder(buttonBorder); timerStop();} if (input == "Pause"){ if (timerruns){ start.setBorder(buttonBorder); pause.setBorder(lowButtonBorder); timerpause = true; tmp_dauer = dauer; //die bisherige Dauer zwischenspeichern timer.stop(); } } if (input == "Neues Projekt"&&!timerruns){ //Projekt-Menü neuesProjekt(); } if (input == "Projekt löschen"&&!timerruns){ if(projektAuswahl.getItemCount()>0){ String temp = projektAuswahl.getSelectedItem().toString(); projektListe.removeElement(temp); projektAuswahl.removeItem(temp); File tmp = new File(temp +".log"); tmp.delete(); sichere("TimeCount",projektListe); frame.pack(); } else JOptionPane.showMessageDialog(frame,"Es gibt nichts zu löschen!"); } if (input == "Aktuelles Projekt als Standard" && projektAuswahl.getItemCount()>0){ setDefaultProjekt(); } if(projektAuswahl.getItemCount()>0){ //sämtliche Log-Datei Menüeinträge haben diese Bedingung if (input == "Log-Datei anzeigen"){ //Log-Datei -Menü showlog = true; showLog(); scrollPane.setVisible(true); frame.pack(); } if (input == "Log-Datei verbergen"){ showlog = false; scrollPane.setVisible(false); frame.remove(scrollPane); frame.pack(); } if (input == "Als Textdatei"){ char s = 9; exportLogDates("txt",s); } if (input == "Für Export nach Excel"){ exportLogDates("csv",';'); } if (input == "Log-Datei löschen"){ Object[] options = {"Ja","Nein"}; int n = JOptionPane.showOptionDialog(frame,"Wenn die Log-Datei gelöscht wird,werden alle Daten \n" + "und die Projektdauer unwiderruflich gelöscht! \n"+"Trotzdem fortfahren?","Warnung",JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE,null, options,options[0]); if(n == JOptionPane.YES_OPTION){ try { FileWriter filesave = new FileWriter(aktProjekt + ".log"); updateLog(); } catch (IOException f){} } } } if (input == "Über TimeCount"){ JOptionPane.showMessageDialog(frame,"Dieses Programm dient der Erfassung und Zuordung\n" + "von Arbeitszeit zu einem Projekt!"); } if (input == "Autor") { JOptionPane.showMessageDialog(frame,"Nicolas de Haen, mail@ndh-websolutions.de"); } if (input == "Beenden") System.exit(0); } /** beim Wechsel des Projekts wird der Timer gestoppt, die Variable aktProjekt und die Log-Tabelle aktualisiert */ public void itemStateChanged(ItemEvent e) { if (timerruns){ timerStop(); } if(projektAuswahl.getItemCount() > 1){ aktProjekt = projektAuswahl.getSelectedItem().toString(); if(showlog){ // die Tabelle mit den Log-Daten erneuern updateLog(); } String selected = e.getItem().toString(); gesamtAnzeige.setText(editLabel( zeitFormat(getProjektDauer(selected),true),4)); } } /**gibt das aktuelle Datum im Format deutscher Wochentag, tt.mm.jjjj zurück*/ public String getDate(){ String wochentag=""; int wt = datum.get(datum.DAY_OF_WEEK); if(wt == 1)wochentag = "So "; if(wt == 2)wochentag = "Mo "; if(wt == 3)wochentag = "Di "; if(wt == 4)wochentag = "Mi "; if(wt == 5)wochentag = "Do "; if(wt == 6)wochentag = "Fr "; if(wt == 7)wochentag = "Sa "; String temp = wochentag + datum.get(datum.DATE)+"." + (datum.get(datum.MONTH)+1) + ".'0" + (datum.get(datum.YEAR)-2000) + "," + getTime(); return temp; } /**gibt die aktuelle Systemzeit im Format hh:mm zurück*/ public String getTime() { String minute; GregorianCalendar temp = new GregorianCalendar(); int h = temp.get(temp.HOUR_OF_DAY); int m = temp.get(temp.MINUTE); minute = "" + m; if(m < 10)minute = "0" + m; return h + ":" + minute; } /** gibt einen String text im HTML-Format mit der Größe size zurück*/ String editLabel(String text, int size){ String temp = "" + text + ""; return temp;} /** stoppt den timer und sichert die Daten für die aktuelle session*/ void timerStop() { if(timerruns){ timerpause = false; timer.stop(); frame.getRootPane().setDefaultButton(start); timerruns = false; if(dauer > 3){ //sollte auf 60 gesetzt werden stopDialog(); sichere(aktProjekt, startZeit + "," + zeitFormat((dauer),true)+"," + anmerkung); if(showlog)updateLog(); } dauer = 0; start.setBorder(buttonBorder); pause.setBorder(buttonBorder); } } /**speichert String s und die Projektdauer in Dateiname*/ public void sichere(String dateiName, String s){ try { String temp1 = lese(dateiName); FileWriter filesave = new FileWriter(dateiName + ".log"); if(temp1!=null){ temp1= temp1.substring(0,temp1.lastIndexOf("|")); //alte Projektdauer löschen filesave.write(s + ";" + temp1 + "|" + projektDauer); } else { projektDauer = dauer; filesave.write(s + "|" + projektDauer); } filesave.close(); } catch (IOException e){} } /**schreibt die Log-Daten in eine Datei mit der Endung format, und dem Trennzeichen s innerhalb der Zeilen*/ void exportLogDates(String format, char s){ if(getLogDates(aktProjekt).size() > 0){ File file; FileDialog saveDial = new FileDialog(frame, "Speichern",FileDialog.SAVE); saveDial.setFile(aktProjekt + "." + format); saveDial.show(); if(saveDial.getFile() != null){ try { PrintWriter filesave = new PrintWriter(new FileWriter(saveDial.getDirectory()+ saveDial.getFile())); Enumeration e = sessions.elements(); char data[] = {s}; String t = new String(data); filesave.println(" Datum"+ t + " Uhrzeit" + t + "Dauer " + t + "Anmerkungen"); while(e.hasMoreElements()){ String temp = e.nextElement().toString().replace(',',s); filesave.println(temp);} filesave.println(""); filesave.println("" + t + "Gesamtdauer:" + t + gesamt); filesave.close(); } catch (IOException e){JOptionPane.showMessageDialog(frame,"Schreibfehler!\n" + "Entweder ist eine gleichnamige Datei schreibgeschützt oder geöffnet,\n" + "oder es gibt ein Problem mit dem Datenträger.");}}} else JOptionPane.showMessageDialog(frame,"Die Log-Datei enthält keine Einträge!"); } /**speichert Strings aus Vector ve in Dateiname*/ public void sichere(String dateiName, Vector ve){ Enumeration e = ve.elements(); String s; try { FileWriter filesave = new FileWriter(dateiName + ".log"); StringBuffer s_temp = new StringBuffer(); if(!ve.isEmpty()){ s_temp.append(e.nextElement().toString()); while (e.hasMoreElements()) { s_temp.append("|" + e.nextElement().toString()); } s = s_temp.toString(); } else s = ""; filesave.write(s); filesave.close(); } catch (IOException f){} } /**liest den Dateiinhalt von dateiname aus und gibt ihn als String zurück*/ public String lese(String dateiName) { String d = null; try { FileReader myReader = new FileReader(dateiName + ".log"); BufferedReader in = new BufferedReader(myReader); d = in.readLine(); myReader.close(); } catch (IOException e){}; return d; } /** splittet String s bei jedem x */ public Vector split(String s, String x){ Vector v = new Vector(); if(s != null){ String k = s; while (k.indexOf(x)>0) { String temp = k.substring(0,k.indexOf(x)); v.addElement(temp); k = k.substring(k.indexOf(x)+1); } v.addElement(k); return v; } else return v; } /**startet den Dialog Projektname eingeben und speichert das neue Projekt*/ public void neuesProjekt(){ try { String neu, temp; String[] avoid = {"\"","/","|","?","*",">","<","\\"}; if(projektAuswahl.getItemCount()<1){ dialog1 = new MyDialog(frame,"Neues Projekt","Bitte erst einen Projektnamen eingeben:","Abbrechen"); } else { dialog1 = new MyDialog(frame,"Neues Projekt","Projektname:","Abbrechen"); } dialog1.show(); if (dialog1.getName() != ""){ temp = dialog1.getName(); if(projektListe.indexOf(temp)> -1 || temp == "TimeCount" ){ JOptionPane.showMessageDialog(frame,"Es gibt bereits ein Projekt mit diesem Namen,\n"+"bitte wähle einen anderen!"); dialog1=null; neuesProjekt(); return; } for (int i=0;i < 8;i++){ if(temp.indexOf(avoid[i])> - 1){ JOptionPane.showMessageDialog(frame,"Ungültiger Projektname!\n"+"Ein Projektname darf keines dieser\n" + " Zeichen enthalten:\n" + " ? * / \\ | \" < >"); dialog1=null; neuesProjekt(); } } FileWriter filesave = new FileWriter(temp + ".log"); //neue log-Datei anlegen filesave.close(); projektAuswahl.addItem(temp); //Projektname der Combo-Box hinzufügen projektAuswahl.setSelectedItem(temp); projektListe.addElement(temp); //Projektname dem Vektor hinzufügen aktProjekt = temp; sichere("TimeCount",projektListe); frame.pack(); } else{} } catch (IOException e){} } /** liest die Projektdauer des aktuellen Projekts aus der log-Datei aus*/ long getProjektDauer(String projektName){ try { String temp = lese(projektName); if(temp!= null){ return Long.parseLong(temp.substring(temp.indexOf("|")+1)); } else return 0; } catch(NullPointerException e){return 0;} catch (NumberFormatException f){return 0;} } /**setzt das ausgewählte Projekte an erste Stelle des Vektors projektListe*/ void setDefaultProjekt() { String projekt = aktProjekt; projektListe.removeElement(projekt); projektListe.insertElementAt(projekt,0); sichere("TimeCount",projektListe);} /** liest die log-Datei von projektName aus und gibt sie in einem 2-dimensionalen Vector zurück*/ Vector getLogDates(String projektName){ String stemp = lese(projektName); Vector vtemp = new Vector(); if(stemp != null){ sessions = split(stemp,";"); String stemp1 = sessions.lastElement().toString();//letzten String speichern sessions.removeElement(sessions.lastElement());//aus Vector entfernen stemp1 = stemp1.substring(0,stemp1.indexOf("|"));//projektDauer aus String entfernen sessions.addElement(stemp1);//und wieder dem Vector hinzufügen Enumeration e = sessions.elements(); while(e.hasMoreElements()){ Vector lines = split(e.nextElement().toString(),","); vtemp.addElement(lines); } } return vtemp; } /** zeigt die Logdatei in einer Tabelle an*/ void showLog() { tableSpalten = split("Datum,Beginn,Dauer,Anmerkung",","); sessionListe = getLogDates(aktProjekt); logTable = new JTable(sessionListe,tableSpalten); logTable.getColumnModel().getColumn(0).setPreferredWidth(18); logTable.getColumnModel().getColumn(1).setPreferredWidth(5); logTable.getColumnModel().getColumn(2).setPreferredWidth(5); logTable.setPreferredScrollableViewportSize(new Dimension(300,68)); scrollPane = new JScrollPane(logTable); scrollPane.setVisible(false); hg.add(scrollPane,"South"); frame.pack(); } void updateLog() { frame.remove(scrollPane); showLog(); scrollPane.setVisible(showlog); frame.pack(); } void stopDialog (){ dialog = new MyDialog(frame,"Anmerkung","Anmerkung:","weiter"); dialog.show(); if (dialog.getName() != null){ anmerkung = clearing(dialog.getName()); } else { anmerkung = ""; } } String clearing(String s){ String temp = s; if(true)temp = s.replace(',',' '); if(s.indexOf(";")> -1)temp = s.replace(';',' '); if(s.indexOf("|")> -1)s.replace('|',' '); if(s.indexOf("\"")> -1)temp = s.replace('\'',' '); return temp; } } //end class TimeCount class MyDialog extends JDialog implements ActionListener { String name; JTextField eingabe; JButton ok, cancel; public MyDialog(JFrame parent,String titel, String textFeld, String knopf2){ super(parent, titel, true); JPanel p1 = new JPanel(); eingabe = new JTextField(15); eingabe.addActionListener(this); p1.add(eingabe); JLabel label1 = new JLabel(textFeld); label1.setHorizontalAlignment(JLabel.CENTER); getContentPane().add(label1,"North"); getContentPane().add(p1,"Center"); JPanel p2 = new JPanel(); ok = new JButton("Ok"); p2.add(ok); cancel = new JButton(knopf2); p2.add(cancel); this.getRootPane().setDefaultButton(ok); cancel.addActionListener(this); getContentPane().add(p2, "South"); ok.addActionListener(this); setSize(250, 120); setLocation(parent.getLocation().x+10,parent.getLocation().y+10); } public void actionPerformed(ActionEvent evt){ String input = evt.getActionCommand(); if ( input !="Abbrechen" && eingabe.getText().length()>0){ name = eingabe.getText();} //Textfeld auslesen else {name = "";} setVisible(false); } public String getName() { /**liest das Textfeld des "Neues Projekt"-Dialoges aus*/ return name; } }