Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No Default Date in SWT DateTime

I'm using a SWT DateTime component. It sets the current date as a default selection, when instanciated. How can i prevent this?

I want that no date is selected at all...

Thanks Patrick

like image 583
Patrick Avatar asked Jan 12 '10 11:01

Patrick


2 Answers

The SWT DateTime control does not support this at all.

I recommend CalendarCombo from the Eclipse Nebula project.

like image 106
qualidafial Avatar answered Oct 14 '22 14:10

qualidafial


If this is still of use to anyone - I had the same problem, meaning that a field on the UI had to show a date or an empty value: because a date that was NOT selected was also valid input. While SWT DateTime has to show some sort of a date, it is not a problem at all introducing another level of indirection by simply making a label and a button - too look like DateTime: The then button calls DateTime in a separate modal window. After the user has made the selection, we write the result to the label back in the application window. You also add another button to the modal window and call it e.g. NONE. If the user clicks NONE, you clear the label field in your application. You will see that I scrape the current value of the date from the label first, so that I can initialize the DateTime control in the modal dialog. This way it all behaves like a new composite control, though I admit it is a bit awkward if you need to do it many times over. E.g.:

private Button buttonDeadlineDate;
private Label labelDeadlineDate;

// ... then define your "composite" control:

lblNewLabel_5 = new Label(group_2, SWT.NONE);
lblNewLabel_5.setBounds(10, 14, 50, 17);
lblNewLabel_5.setText("Deadline:");

// We make our own composite date control out of a label and a button
// and we call a modal dialog box with the SWT DateTime and
// some buttons.
labelDeadlineDate = new Label(group_2, SWT.BORDER | SWT.CENTER);
labelDeadlineDate.setBounds(62, 10, 76, 20);
// Note that I use the strange font DokChampa because this was the only way to get a margin at the top.
labelDeadlineDate.setFont(SWTResourceManager.getFont("DokChampa", 8, SWT.NORMAL));
labelDeadlineDate.setBackground(SWTResourceManager.getColor(255, 255, 255));  // so it does appear editable
buttonDeadlineDate = new Button (group_2, SWT.NONE);
buttonDeadlineDate.setBounds(136, 11, 20, 20); // x - add 74, y - add 1 with respect to label


// ... And later we have the call-back from the listener on the little button above:

    //========================================
    // Deadline Date
    //========================================

    buttonDeadlineDate.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(SelectionEvent e) {

        // Define the dialog shell.
        // Note: DIALOG_TRIM = TITLE | CLOSE | BORDER (a typical application dialog shell)
        final Shell dialog = new Shell (shlTaskScheduler, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
                dialog.setText("Enter deadline date (NONE for none)");

        //========================================
        // Position and size the dialog (relative to the application).
        // could have probably also used a single call to dialog.setBounds()
        // instead of calling setLocation() and setSize().
        //========================================
        Point myPoint = new Point(0,0);
        myPoint = shlTaskScheduler.getLocation();
        myPoint.x +=80; // myPoint.x +=30;
        myPoint.y +=320; // myPoint.y +=350;
        dialog.setLocation(myPoint);
        dialog.setSize(270, 220);

        dialog.setLayout (null);

        //========================================
        // Define dialog contents
        //========================================

        // Make controls final they it can be accessed from the listener.

        final DateTime DTDeadlineDate;
        DTDeadlineDate = new DateTime(dialog, SWT.BORDER | SWT.CALENDAR | SWT.DROP_DOWN);
        DTDeadlineDate.setBounds(10, 10, 175, 175);

        final Button buttonNone = new Button (dialog, SWT.PUSH);
        buttonNone.setText ("NONE");
        buttonNone.setBounds(200, 35, 55, 25);

        final Button buttonOK = new Button (dialog, SWT.PUSH);
        buttonOK.setText ("OK");
        buttonOK.setBounds(200, 85, 55, 25);

        //========================================
        // Initialize the DateTime control to
        // the date displayed on the button or today's date.
        //========================================

        // Get the deadline from the main application window
        String newDeadlineDateString = (labelDeadlineDate.getText().toString());
        myLogger.i (className, "got deadline from main application window as " + newDeadlineDateString);

        // If deadline date found, use it to initialize the DateTime control
        // else the DateTime control will initialize itself to the current date automatically.  
        if ((newDeadlineDateString.length() == 10) // probably unnecessary test
        && (isThisDateValid(newDeadlineDateString, "yyyy-MM-dd"))) {

            // parse and extract components
            try {
                String tmpYearString= newDeadlineDateString.substring(0,4);
                String tmpMoString = newDeadlineDateString.substring(5,7);
                String tmpDayString = newDeadlineDateString.substring(8,10);

                int tmpYearInt = Integer.parseInt(tmpYearString);
                int tmpMoInt = Integer.parseInt(tmpMoString);
                int tmpDayInt = Integer.parseInt(tmpDayString);

                DTDeadlineDate.setYear(tmpYearInt);
                DTDeadlineDate.setMonth(tmpMoInt - 1); // the control counts the months beginning with 0! - like the calendar
                DTDeadlineDate.setDay(tmpDayInt);

            } catch(NumberFormatException f) {
                // this should not happen because we have a legal date
                myScreenMessage.e(className, "Error extracting deadline date from screen <" + newDeadlineDateString + ">. Ignoring");
            }
        } else if (newDeadlineDateString.length() > 0) {
            myLogger.w (className, "Illegal current deadline date value or format <" + newDeadlineDateString + ">. Ignoring.");
            // no need to do anything, as the control will initialize itself to the current date
        } else {
            // no need to do anything, as the control will initialize itself to the current date
        }

        //========================================
        // Set up the listener and assign it to the OK and None buttons.
        // Note that the dialog has not been opened yet, but this seems OK.
        //
        // Note that we define a generic listener and then associate it with a control.
        // Thus we need to check in the listener, which control we happen to be in.
        // This is a valid way of doing it, as an alternative to using
        //      addListener() or
        //      addSelectionListener()
        // for specific controls.
        //========================================

        Listener listener = new Listener () {
            public void handleEvent (Event event) {

                if (event.widget == buttonOK) {

                    int newDeadlineDay = DTDeadlineDate.getDay();
                    int newDeadlineMonth = DTDeadlineDate.getMonth() + 1; // the returned month will start at 0
                    int newDeadlineYear = DTDeadlineDate.getYear();

                    String selectedDeadlineDate = String.format ("%04d-%02d-%02d", newDeadlineYear, newDeadlineMonth, newDeadlineDay);
                    if (isThisDateValid(selectedDeadlineDate, "yyyy-MM-dd")) {
                        labelDeadlineDate.setText(selectedDeadlineDate);
                    } else {
                        // This is strange as the widget should only return valid dates...
                        myScreenMessage.e(className, "Illegal deadline date selected: resetting to empty date");
                        labelDeadlineDate.setText("");
                    }

                } else if (event.widget == buttonNone) {
                    // an empty date is also an important value
                    labelDeadlineDate.setText("");
                } else {
                    // this should not happen as there are no other buttons on the dialog
                    myLogger.e(className, "Unexpected widget state: ignoring");
                } 

                // once a button is pressed, we close the dialog    
                dialog.close ();
            }
        };

        // Still need to assign the listener to the buttons         
        buttonOK.addListener (SWT.Selection, listener);
        buttonNone.addListener (SWT.Selection, listener);

        //========================================
        // Display the date dialog.
        //========================================
        dialog.open ();

        //========================================
        // If you need to do this - you can wait for user selection before returning from this listener.
        // Note that this wait is not necessary so that the above button listeners
        // can capture events, but rather so that we do not continue execution and end this
        // function call before the user has made a date selection clicked on a button.
        // Otherwise we would just go on.

        while (!dialog.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }

        ...

    }
    });
like image 31
Wojtek Jarosz Avatar answered Oct 14 '22 12:10

Wojtek Jarosz