Esempio n. 1
0
/**
 * Compares two FileItems.
 *
 * Based on 'ustricmp' of Allegro. It makes sure that eg "foo.bar"
 * comes before "foo-1.bar", and also that "foo9.bar" comes before
 * "foo10.bar".
 */
int FileItem::compare(const FileItem& that) const
{
  if (IS_FOLDER(this)) {
    if (!IS_FOLDER(&that))
      return -1;
  }
  else if (IS_FOLDER(&that))
    return 1;

  {
    int c1, c2;
    int x1, x2;
    char *t1, *t2;
    const char* s1 = this->displayname.c_str();
    const char* s2 = that.displayname.c_str();

    for (;;) {
      c1 = utolower(ugetxc(&s1));
      c2 = utolower(ugetxc(&s2));

      if ((c1 >= '0') && (c1 <= '9') && (c2 >= '0') && (c2 <= '9')) {
        x1 = ustrtol(s1 - ucwidth(c1), &t1, 10);
        x2 = ustrtol(s2 - ucwidth(c2), &t2, 10);
        if (x1 != x2)
          return x1 - x2;
        else if (t1 - s1 != t2 - s2)
          return (t2 - s2) - (t1 - s1);
        s1 = t1;
        s2 = t2;
      }
      else if (c1 != c2) {
        if (!c1)
          return -1;
        else if (!c2)
          return 1;
        else if (c1 == '.')
          return -1;
        else if (c2 == '.')
          return 1;
        return c1 - c2;
      }

      if (!c1)
        return 0;
    }
  }

  return -1;
}
Esempio n. 2
0
/* ustrfilecmp:
  *  ustricmp for filenames: makes sure that eg "foo.bar" comes before
  *  "foo-1.bar", and also that "foo9.bar" comes before "foo10.bar".
  */
static int ustrfilecmp(AL_CONST char *s1, AL_CONST char *s2)
{
    int c1, c2;
    int x1, x2;
    char *t1, *t2;
    
    for(;;)
    {
        c1 = utolower(ugetxc(&s1));
        c2 = utolower(ugetxc(&s2));
        
        if((c1 >= '0') && (c1 <= '9') && (c2 >= '0') && (c2 <= '9'))
        {
            x1 = ustrtol(s1 - ucwidth(c1), &t1, 10);
            x2 = ustrtol(s2 - ucwidth(c2), &t2, 10);
            
            if(x1 != x2)
                return x1 - x2;
            else if(t1 - s1 != t2 - s2)
                return (t2 - s2) - (t1 - s1);
                
            s1 = t1;
            s2 = t2;
        }
        else if(c1 != c2)
        {
            if(!c1)
                return -1;
            else if(!c2)
                return 1;
            else if(c1 == '.')
                return -1;
            else if(c2 == '.')
                return 1;
                
            return c1 - c2;
        }
        
        if(!c1)
            return 0;
    }
}
Esempio n. 3
0
static void process_one_word(Accelerator* accel, char* word)
{
  KeyModifiers modifiers = kKeyNoneModifier;
  KeyScancode scancode = kKeyNil;
  int ascii = 0;
  char* tok;

  // Special case: plus sign
  if (word[0] == '+' && word[1] == 0) {
    accel->addKey(kKeyNoneModifier, kKeyNil, '+');
    return;
  }

  for (tok=ustrtok(word, "+"); tok;
       tok=ustrtok(NULL, "+")) {
    // Modifiers

    if (ustricmp(tok, "Shift") == 0) {
      modifiers = (KeyModifiers)((int)modifiers | (int)kKeyShiftModifier);
    }
    else if (ustricmp (tok, "Alt") == 0) {
      modifiers = (KeyModifiers)((int)modifiers | (int)kKeyAltModifier);
    }
    else if (ustricmp (tok, "Ctrl") == 0) {
      modifiers = (KeyModifiers)((int)modifiers | (int)kKeyCtrlModifier);
    }

    // Scancode

    // word with one character
    else if (tok[1] == 0) {
      if (((*tok >= 'a') && (*tok <= 'z')) ||
          ((*tok >= 'A') && (*tok <= 'Z'))) {
        ascii = tolower(*tok);
      }
      else {
        ascii = *tok;
      }

      if (((*tok >= 'a') && (*tok <= 'z')) ||
          ((*tok >= 'A') && (*tok <= 'Z')))
        scancode = (KeyScancode)((int)kKeyA + tolower(*tok) - 'a');
      else if ((*tok >= '0') && (*tok <= '9'))
        scancode = (KeyScancode)((int)kKey0 + *tok - '0');
      else {
        switch (*tok) {
          case '~': scancode = kKeyTilde; break;
          case '-': scancode = kKeyMinus; break;
          case '=': scancode = kKeyEquals; break;
          case '[': scancode = kKeyOpenbrace; break;
          case ']': scancode = kKeyClosebrace; break;
          case ';': scancode = kKeyColon; break;
          case '\'': scancode = kKeyQuote; break;
          case '\\': scancode = kKeyBackslash; break;
          case ',': scancode = kKeyComma; break;
          case '.': scancode = kKeyStop; break;
          case '/': scancode = kKeySlash; break;
          case '*': scancode = kKeyAsterisk; break;
        }
      }
    }
    /* other ones */
    else {
      /* F1, F2, ..., F11, F12 */
      if ((toupper (*tok) == 'F') && (ustrlen(tok) <= 3)) {
        int num = ustrtol(tok+1, NULL, 10);
        if ((num >= 1) && (num <= 12))
          scancode = (KeyScancode)((int)kKeyF1 + num - 1);
      }
      else if ((ustricmp(tok, "Escape") == 0) ||
               (ustricmp(tok, "Esc") == 0))
        scancode = kKeyEsc;
      else if (ustricmp(tok, "Backspace") == 0)
        scancode = kKeyBackspace;
      else if (ustricmp(tok, "Tab") == 0)
        scancode = kKeyTab;
      else if (ustricmp(tok, "Enter") == 0)
        scancode = kKeyEnter;
      else if (ustricmp(tok, "Space") == 0)
        scancode = kKeySpace;
      else if ((ustricmp(tok, "Insert") == 0) ||
               (ustricmp(tok, "Ins") == 0))
        scancode = kKeyInsert;
      else if ((ustricmp(tok, "Delete") == 0) ||
               (ustricmp(tok, "Del") == 0))
        scancode = kKeyDel;
      else if (ustricmp(tok, "Home") == 0)
        scancode = kKeyHome;
      else if (ustricmp(tok, "End") == 0)
        scancode = kKeyEnd;
      else if ((ustricmp(tok, "Page Up") == 0) ||
               (ustricmp(tok, "PgUp") == 0))
        scancode = kKeyPageUp;
      else if ((ustricmp(tok, "Page Down") == 0) ||
               (ustricmp(tok, "PgDn") == 0))
        scancode = kKeyPageDown;
      else if (ustricmp(tok, "Left") == 0)
        scancode = kKeyLeft;
      else if (ustricmp(tok, "Right") == 0)
        scancode = kKeyRight;
      else if (ustricmp(tok, "Up") == 0)
        scancode = kKeyUp;
      else if (ustricmp(tok, "Down") == 0)
        scancode = kKeyDown;
      else if (ustricmp(tok, "0 Pad") == 0)
        scancode = kKey0Pad;
      else if (ustricmp(tok, "1 Pad") == 0)
        scancode = kKey1Pad;
      else if (ustricmp(tok, "2 Pad") == 0)
        scancode = kKey2Pad;
      else if (ustricmp(tok, "3 Pad") == 0)
        scancode = kKey3Pad;
      else if (ustricmp(tok, "4 Pad") == 0)
        scancode = kKey4Pad;
      else if (ustricmp(tok, "5 Pad") == 0)
        scancode = kKey5Pad;
      else if (ustricmp(tok, "6 Pad") == 0)
        scancode = kKey6Pad;
      else if (ustricmp(tok, "7 Pad") == 0)
        scancode = kKey7Pad;
      else if (ustricmp(tok, "8 Pad") == 0)
        scancode = kKey8Pad;
      else if (ustricmp(tok, "9 Pad") == 0)
        scancode = kKey9Pad;
      else if (ustricmp(tok, "Slash Pad") == 0)
        scancode = kKeySlashPad;
      else if (ustricmp(tok, "Asterisk") == 0)
        scancode = kKeyAsterisk;
      else if (ustricmp(tok, "Minus Pad") == 0)
        scancode = kKeyMinusPad;
      else if (ustricmp(tok, "Plus Pad") == 0)
        scancode = kKeyPlusPad;
      else if (ustricmp(tok, "Del Pad") == 0)
        scancode = kKeyDelPad;
      else if (ustricmp(tok, "Enter Pad") == 0)
        scancode = kKeyEnterPad;
    }
  }

  accel->addKey(modifiers, scancode, ascii);
}
Esempio n. 4
0
void RotateCanvasCommand::onLoadParams(Params* params)
{
  if (params->has_param("angle")) {
    m_angle = ustrtol(params->get("angle").c_str(), NULL, 10);
  }
}
Esempio n. 5
0
static Widget* convert_xmlelement_to_widget(TiXmlElement* elem, Widget* root)
{
  const char *elem_name = elem->Value();
  JWidget widget = NULL;
  JWidget child;

  /* TODO error handling: add a message if the widget is bad specified */

  // Boxes
  if (ustrcmp(elem_name, "box") == 0) {
    bool horizontal  = bool_attr_is_true(elem, "horizontal");
    bool vertical    = bool_attr_is_true(elem, "vertical");
    bool homogeneous = bool_attr_is_true(elem, "homogeneous");

    widget = new Box((horizontal ? JI_HORIZONTAL:
                      vertical ? JI_VERTICAL: 0) |
                     (homogeneous ? JI_HOMOGENEOUS: 0));
  }
  else if (ustrcmp(elem_name, "vbox") == 0) {
    bool homogeneous = bool_attr_is_true(elem, "homogeneous");

    widget = new VBox();
    if (homogeneous)
      widget->setAlign(widget->getAlign() | JI_HOMOGENEOUS);
  }
  else if (ustrcmp(elem_name, "hbox") == 0) {
    bool homogeneous = bool_attr_is_true(elem, "homogeneous");

    widget = new HBox();
    if (homogeneous)
      widget->setAlign(widget->getAlign() | JI_HOMOGENEOUS);
  }
  else if (ustrcmp(elem_name, "boxfiller") == 0) {
    widget = new BoxFiller();
  }
  // Button
  else if (ustrcmp(elem_name, "button") == 0) {
    const char *text = elem->Attribute("text");

    widget = new Button(text ? TRANSLATE_ATTR(text): NULL);
    if (widget) {
      bool left   = bool_attr_is_true(elem, "left");
      bool right  = bool_attr_is_true(elem, "right");
      bool top    = bool_attr_is_true(elem, "top");
      bool bottom = bool_attr_is_true(elem, "bottom");
      bool closewindow = bool_attr_is_true(elem, "closewindow");
      const char *_bevel = elem->Attribute("bevel");

      widget->setAlign((left ? JI_LEFT: (right ? JI_RIGHT: JI_CENTER)) |
                       (top ? JI_TOP: (bottom ? JI_BOTTOM: JI_MIDDLE)));

      if (_bevel != NULL) {
        char* bevel = base_strdup(_bevel);
        int c, b[4];
        char *tok;

        for (c=0; c<4; ++c)
          b[c] = 0;

        for (tok=ustrtok(bevel, " "), c=0;
             tok;
             tok=ustrtok(NULL, " "), ++c) {
          if (c < 4)
            b[c] = ustrtol(tok, NULL, 10);
        }
        base_free(bevel);

        setup_bevels(widget, b[0], b[1], b[2], b[3]);
      }

      if (closewindow) {
        static_cast<Button*>(widget)
          ->Click.connect(Bind<void>(&Widget::closeWindow, widget));
      }
    }
  }
  // Check
  else if (ustrcmp(elem_name, "check") == 0) {
    const char *text = elem->Attribute("text");
    const char *looklike = elem->Attribute("looklike");

    text = (text ? TRANSLATE_ATTR(text): NULL);

    if (looklike != NULL && strcmp(looklike, "button") == 0) {
      widget = new CheckBox(text, JI_BUTTON);
    }
    else {
      widget = new CheckBox(text);
    }

    if (widget) {
      bool center = bool_attr_is_true(elem, "center");
      bool right  = bool_attr_is_true(elem, "right");
      bool top    = bool_attr_is_true(elem, "top");
      bool bottom = bool_attr_is_true(elem, "bottom");

      widget->setAlign((center ? JI_CENTER:
                        (right ? JI_RIGHT: JI_LEFT)) |
                       (top    ? JI_TOP:
                        (bottom ? JI_BOTTOM: JI_MIDDLE)));
    }
  }
  /* combobox */
  else if (ustrcmp(elem_name, "combobox") == 0) {
    widget = new ComboBox();
  }
  /* entry */
  else if (ustrcmp(elem_name, "entry") == 0) {
    const char *maxsize = elem->Attribute("maxsize");
    const char *text = elem->Attribute("text");

    if (maxsize != NULL) {
      bool readonly = bool_attr_is_true(elem, "readonly");

      widget = new Entry(ustrtol(maxsize, NULL, 10),
                         text ? TRANSLATE_ATTR(text): NULL);

      if (readonly)
        ((Entry*)widget)->setReadOnly(true);
    }
  }
  /* grid */
  else if (ustrcmp(elem_name, "grid") == 0) {
    const char *columns = elem->Attribute("columns");
    bool same_width_columns = bool_attr_is_true(elem, "same_width_columns");

    if (columns != NULL) {
      widget = new Grid(ustrtol(columns, NULL, 10),
                        same_width_columns);
    }
  }
  /* label */
  else if (ustrcmp(elem_name, "label") == 0) {
    const char *text = elem->Attribute("text");

    widget = new Label(text ? TRANSLATE_ATTR(text): NULL);
    if (widget) {
      bool center = bool_attr_is_true(elem, "center");
      bool right  = bool_attr_is_true(elem, "right");
      bool top    = bool_attr_is_true(elem, "top");
      bool bottom = bool_attr_is_true(elem, "bottom");

      widget->setAlign((center ? JI_CENTER:
                        (right ? JI_RIGHT: JI_LEFT)) |
                       (top    ? JI_TOP:
                        (bottom ? JI_BOTTOM: JI_MIDDLE)));
    }
  }
  /* listbox */
  else if (ustrcmp(elem_name, "listbox") == 0) {
    widget = new ListBox();
  }
  /* listitem */
  else if (ustrcmp(elem_name, "listitem") == 0) {
    const char *text = elem->Attribute("text");

    widget = new ListBox::Item(text ? TRANSLATE_ATTR(text): NULL);
  }
  /* splitter */
  else if (ustrcmp(elem_name, "splitter") == 0) {
    bool horizontal = bool_attr_is_true(elem, "horizontal");
    bool vertical = bool_attr_is_true(elem, "vertical");

    widget = new Splitter(horizontal ? JI_HORIZONTAL:
                          vertical ? JI_VERTICAL: 0);
  }
  /* radio */
  else if (ustrcmp(elem_name, "radio") == 0) {
    const char* text = elem->Attribute("text");
    const char* group = elem->Attribute("group");
    const char *looklike = elem->Attribute("looklike");

    text = (text ? TRANSLATE_ATTR(text): NULL);
    int radio_group = (group ? ustrtol(group, NULL, 10): 1);

    if (looklike != NULL && strcmp(looklike, "button") == 0) {
      widget = new RadioButton(text, radio_group, JI_BUTTON);
    }
    else {
      widget = new RadioButton(text, radio_group);
    }

    if (widget) {
      bool center = bool_attr_is_true(elem, "center");
      bool right  = bool_attr_is_true(elem, "right");
      bool top    = bool_attr_is_true(elem, "top");
      bool bottom = bool_attr_is_true(elem, "bottom");

      widget->setAlign((center ? JI_CENTER:
                        (right ? JI_RIGHT: JI_LEFT)) |
                       (top    ? JI_TOP:
                        (bottom ? JI_BOTTOM: JI_MIDDLE)));
    }
  }
  /* separator */
  else if (ustrcmp(elem_name, "separator") == 0) {
    const char *text = elem->Attribute("text");
    bool center      = bool_attr_is_true(elem, "center");
    bool right       = bool_attr_is_true(elem, "right");
    bool middle      = bool_attr_is_true(elem, "middle");
    bool bottom      = bool_attr_is_true(elem, "bottom");
    bool horizontal  = bool_attr_is_true(elem, "horizontal");
    bool vertical    = bool_attr_is_true(elem, "vertical");

    widget = new Separator(text ? TRANSLATE_ATTR(text): NULL,
                           (horizontal ? JI_HORIZONTAL: 0) |
                           (vertical ? JI_VERTICAL: 0) |
                           (center ? JI_CENTER:
                            (right ? JI_RIGHT: JI_LEFT)) |
                           (middle ? JI_MIDDLE:
                            (bottom ? JI_BOTTOM: JI_TOP)));
  }
  /* slider */
  else if (ustrcmp(elem_name, "slider") == 0) {
    const char *min = elem->Attribute("min");
    const char *max = elem->Attribute("max");
    int min_value = min != NULL ? ustrtol(min, NULL, 10): 0;
    int max_value = max != NULL ? ustrtol(max, NULL, 10): 0;

    widget = new Slider(min_value, max_value, min_value);
  }
  /* textbox */
  else if (ustrcmp(elem_name, "textbox") == 0) {
    //bool wordwrap = bool_attr_is_true(elem, "wordwrap");

    /* TODO add translatable support */
    /* TODO here we need jxmlelem_get_text(elem) */
    /* widget = jtextbox_new(tag->text, wordwrap ? JI_WORDWRAP: 0); */
    ASSERT(false);
  }
  /* view */
  else if (ustrcmp(elem_name, "view") == 0) {
    widget = new View();
  }
  /* window */
  else if (ustrcmp(elem_name, "window") == 0) {
    const char *text = elem->Attribute("text");

    if (text) {
      bool desktop = bool_attr_is_true(elem, "desktop");

      if (desktop)
        widget = new Frame(true, NULL);
      else
        widget = new Frame(false, TRANSLATE_ATTR(text));
    }
  }
  /* colorpicker */
  else if (ustrcmp(elem_name, "colorpicker") == 0) {
    widget = new ColorButton(Color::fromMask(), app_get_current_pixel_format());
  }

  // Was the widget created?
  if (widget) {
    const char *name      = elem->Attribute("name");
    const char *tooltip   = elem->Attribute("tooltip");
    bool selected         = bool_attr_is_true(elem, "selected");
    bool disabled         = bool_attr_is_true(elem, "disabled");
    bool expansive        = bool_attr_is_true(elem, "expansive");
    bool magnetic         = bool_attr_is_true(elem, "magnetic");
    bool noborders        = bool_attr_is_true(elem, "noborders");
    const char *width     = elem->Attribute("width");
    const char *height    = elem->Attribute("height");
    const char *minwidth  = elem->Attribute("minwidth");
    const char *minheight = elem->Attribute("minheight");
    const char *maxwidth  = elem->Attribute("maxwidth");
    const char *maxheight = elem->Attribute("maxheight");
    const char *childspacing = elem->Attribute("childspacing");

    if (name != NULL)
      widget->setName(name);

    if (tooltip != NULL)
      jwidget_add_tooltip_text(widget, tooltip, JI_LEFT);

    if (selected)
      widget->setSelected(selected);

    if (disabled)
      widget->setEnabled(false);

    if (expansive)
      widget->setExpansive(true);

    if (magnetic)
      widget->setFocusMagnet(true);

    if (noborders)
      jwidget_noborders(widget);

    if (childspacing)
      widget->child_spacing = ustrtol(childspacing, NULL, 10);

    if (width || minwidth ||
        height || minheight) {
      int w = (width || minwidth) ? ustrtol(width ? width: minwidth, NULL, 10): 0;
      int h = (height || minheight) ? ustrtol(height ? height: minheight, NULL, 10): 0;
      jwidget_set_min_size(widget, w*jguiscale(), h*jguiscale());
    }

    if (width || maxwidth ||
        height || maxheight) {
      int w = (width || maxwidth) ? strtol(width ? width: maxwidth, NULL, 10): INT_MAX;
      int h = (height || maxheight) ? strtol(height ? height: maxheight, NULL, 10): INT_MAX;
      jwidget_set_max_size(widget, w*jguiscale(), h*jguiscale());
    }

    if (!root)
      root = widget;

    // Children
    TiXmlElement* child_elem = elem->FirstChildElement();
    while (child_elem) {
      child = convert_xmlelement_to_widget(child_elem, root);
      if (child) {
        // Attach the child in the view
        if (widget->type == JI_VIEW) {
          static_cast<View*>(widget)->attachToView(child);
          break;
        }
        // Add the child in the grid
        else if (widget->type == JI_GRID) {
          const char* cell_hspan = child_elem->Attribute("cell_hspan");
          const char* cell_vspan = child_elem->Attribute("cell_vspan");
          const char* cell_align = child_elem->Attribute("cell_align");
          int hspan = cell_hspan ? ustrtol(cell_hspan, NULL, 10): 1;
          int vspan = cell_vspan ? ustrtol(cell_vspan, NULL, 10): 1;
          int align = cell_align ? convert_align_value_to_flags(cell_align): 0;
          Grid* grid = dynamic_cast<Grid*>(widget);
          ASSERT(grid != NULL);

          grid->addChildInCell(child, hspan, vspan, align);
        }
        // Just add the child in any other kind of widget
        else
          widget->addChild(child);
      }
      child_elem = child_elem->NextSiblingElement();
    }

    if (widget->type == JI_VIEW) {
      bool maxsize = bool_attr_is_true(elem, "maxsize");
      if (maxsize)
        static_cast<View*>(widget)->makeVisibleAllScrollableArea();
    }
  }

  return widget;
}