@Override
    protected void showPopupMenu(MouseEvent ev) {
      // first select/deselect the row:
      int iRow = tblTasks.rowAtPoint(ev.getPoint());

      // Nur, wenn nicht selektiert, selektieren:
      if (!tblTasks.isRowSelected(iRow)) {
        if ((ev.getModifiers() & MouseEvent.CTRL_MASK) != 0) {
          // Control gedr\u00fcckt:
          // Zeile zur Selektion hinzuf\u00fcgen:
          tblTasks.addRowSelectionInterval(iRow, iRow);
        } else {
          // Sonst nur diese Zeile selektieren:
          tblTasks.setRowSelectionInterval(iRow, iRow);
        }
      } // if

      // enable/disable menu items
      final int iSelectedRow = this.tblTasks.getSelectedRow();
      final TimelimitTaskTableModel model = timelimittaskview.getTimelimitTaskTableModel();
      model.getTimelimitTask(iSelectedRow);

      // todo: there should be a better place for that...
      final boolean bPerformEnabled =
          existsRelatedObjectsFor(getSelectedTimelimitTasks(timelimittaskview));
      actPerformTask.setEnabled(bPerformEnabled);
      // this.popupTimelimitTasks.miPerform.setEnabled(bPerformEnabled);

      final boolean bFinished = areTasksCompleted(getSelectedTimelimitTasks(timelimittaskview));
      this.popupTimelimitTasks.miFinish.setState(bFinished);

      super.showPopupMenu(ev);
    }
  private TimelimitTaskTableModel newTimelimitTaskTableModel() {
    final TimelimitTaskTableModel result = new TimelimitTaskTableModel();

    // add columns:
    final List<String> lstFieldNames =
        new LinkedList<String>(CollectableTimelimitTask.clcte.getFieldNames());

    // sort using the order stored in the preferences:
    List<String> lstFieldNameOrderTemp;
    try {
      lstFieldNameOrderTemp = PreferencesUtils.getStringList(this.prefs, PREFS_NODE_SELECTEDFIELDS);
    } catch (PreferencesException ex) {
      LOG.error(
          "Failed to retrieve list of selected fields from the preferences. They will be empty.");
      lstFieldNameOrderTemp = new ArrayList<String>();
    }
    final List<String> lstFieldNameOrder = lstFieldNameOrderTemp;

    Collections.sort(
        lstFieldNames,
        new Comparator<String>() {
          private int getOrder(Object o) {
            int result = lstFieldNameOrder.indexOf(o);
            if (result == -1) {
              // new fields are shown at the end:
              result = lstFieldNameOrder.size();
            }
            return result;
          }

          @Override
          public int compare(String o1, String o2) {
            int iDiff = getOrder(o1) - getOrder(o2);
            return (iDiff == 0) ? 0 : (iDiff / Math.abs(iDiff));
          }
        });

    int iColumn = 0;
    final List<String> lstNamesOfFieldsToDisplay =
        CollectableTimelimitTask.clcte.getNamesOfFieldsToDisplay();
    for (Iterator<String> iter = lstFieldNames.iterator(); iter.hasNext(); ) {
      final String sFieldName = iter.next();
      final CollectableEntityField clctef =
          CollectableTimelimitTask.clcte.getEntityField(sFieldName);
      if (lstNamesOfFieldsToDisplay.contains(sFieldName)) {
        result.addColumn(iColumn++, clctef);
      }
    }

    if (result.getColumnCount() > 0) {
      result.setSortKeys(Collections.singletonList(new SortKey(0, SortOrder.ASCENDING)), false);
    }

    return result;
  }
 private void setupTableModelSorting() {
   final TimelimitTaskTableModel tblmdl = this.timelimittaskview.getTimelimitTaskTableModel();
   if (tblmdl.getColumnCount() > 0) {
     List<SortKey> sortKeys = readColumnOrderFromPreferences();
     if (sortKeys.isEmpty()) {
       sortKeys =
           Collections.singletonList(
               new SortKey(
                   tblmdl.findColumnByFieldName(CollectableTask.FIELDNAME_SCHEDULED),
                   SortOrder.ASCENDING));
     }
     try {
       tblmdl.setSortKeys(sortKeys, false);
     } catch (Exception e) {
     }
   }
 }
  public void refreshTimelimitTaskView() {
    boolean bUnfinishedOnly = !this.timelimittaskview.btnShowAllTasks.getModel().isSelected();
    final Collection<TimelimitTaskVO> colltaskvo =
        this.tltaskDelegate.getTimelimitTasks(bUnfinishedOnly);
    final List<CollectableTimelimitTask> lstclct =
        CollectionUtils.transform(colltaskvo, new CollectableTimelimitTask.MakeCollectable());

    final TimelimitTaskTableModel tblmdl = this.timelimittaskview.getTimelimitTaskTableModel();
    tblmdl.setCollectables(lstclct);

    // TableUtils.setOptimalColumnWidths(this.timelimittaskview.getTable());
    TaskController.setColumnWidths(
        readColumnWidthsFromPreferences(), this.timelimittaskview.getTable());

    // todo: sorting order? / UA
    //		final int iColumnScheduled =
    // tblmdl.findColumnByFieldName(CollectableTimelimitTask.FIELDNAME_SCHEDULED);
    //		tblmdl.setSortingOrder(iColumnScheduled, true, true);

    //	NUCLOS-642
    setupRenderers(timelimittaskview.getTable());
  }
    @Override
    public boolean importData(JComponent comp, Transferable transferable) {
      boolean result = false;

      if (comp instanceof JTable) {
        final JTable tbl = (JTable) comp;

        try {
          final int iSelectedRow = tbl.getSelectedRow();
          if (iSelectedRow != -1) {
            final TimelimitTaskTableModel tblmdl =
                TimelimitTaskController.this.timelimittaskview.getTimelimitTaskTableModel();
            final CollectableTimelimitTask clctTarget = tblmdl.getCollectable(iSelectedRow);
            final TimelimitTaskVO taskvoTarget = clctTarget.getTimelimitTaskVO();

            final GenericObjectIdModuleProcess goimp =
                (GenericObjectIdModuleProcess)
                    transferable.getTransferData(new GenericObjectIdModuleProcess.DataFlavor());

            if (taskvoTarget.getCompleted() != null) {
              final String sMessage =
                  getSpringLocaleDelegate()
                      .getMessage(
                          "TimelimitTaskController.5",
                          "Dieser Eintrag ist bereits abgeschlossen. Er kann nicht mehr ver\u00e4ndert werden.");
              throw new NuclosBusinessException(sMessage);
            }
            boolean bDoIt = (taskvoTarget.getGenericObjectId() == null);
            if (!bDoIt) {
              final String sQuestion =
                  getSpringLocaleDelegate()
                          .getMessage(
                              "TimelimitTaskController.13",
                              "Soll das Objekt \"{0}\" zugeordnet werden?",
                              goimp.getGenericObjectIdentifier())
                      + "\n"
                      + getSpringLocaleDelegate()
                          .getMessage(
                              "TimelimitTaskController.3",
                              "Die bestehende Zuordnung zu \"{0}\" wird dadurch aufgehoben.",
                              taskvoTarget.getIdentifier());
              final int iBtn =
                  JOptionPane.showConfirmDialog(
                      this.parent,
                      sQuestion,
                      getSpringLocaleDelegate()
                          .getMessage(
                              "TimelimitTaskController.17", "Zugeordnetes Objekt \u00e4ndern"),
                      JOptionPane.OK_CANCEL_OPTION);
              bDoIt = (iBtn == JOptionPane.OK_OPTION);
            }

            if (bDoIt) {
              taskvoTarget.setGenericObjectId(new Integer(goimp.getGenericObjectId()));
              final TimelimitTaskVO taskvoUpdated = tltaskDelegate.update(taskvoTarget);
              tblmdl.setCollectable(iSelectedRow, new CollectableTimelimitTask(taskvoUpdated));
              result = true;
            }
          }
        } catch (UnsupportedFlavorException ex) {
          JOptionPane.showMessageDialog(
              parent,
              getSpringLocaleDelegate()
                  .getMessage(
                      "TimelimitTaskController.4",
                      "Dieser Datentransfer wird von dem ausgew\u00e4hlten Objekt nicht unterst\u00fctzt."));
        } catch (IOException ex) {
          throw new NuclosFatalException(ex);
        } catch (CommonBusinessException ex) {
          Errors.getInstance().showExceptionDialog(parent, ex);
        }
      }

      return result;
    }