No default date in SWT DateTime

I am using the SWT DateTime component. It sets the current date as the default selection, if one has been set. How can I prevent this?

I want the date not to be selected at all ...

Thanks Patrick

+3
source share
3 answers

The DateTime SWT control does not support this at all.

I recommend CalendarCombo from the Eclipse Nebula project.

+3
source

- , , : . SWT DateTime - , , , - DateTime: DateTime . , , . , . . NONE, . , , DateTime . , , , , . :.

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 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();
            }
        }

        ...

    }
    });
+3

You need to manually set the instance fields to 0 or zero, whatever is appropriate. You can also implement your own NoDateTime object (using the null object template) to accomplish the same thing. I will be tempted not to imagine time with zero, but is there a reason why you cannot do this?

+1
source

Source: https://habr.com/ru/post/1728167/


All Articles