| 270 [b cell].state = NSControlStateValueOff; |
274 [b cell].state = NSControlStateValueOff; |
| 271 } |
275 } |
| 272 index++; |
276 index++; |
| 273 } |
277 } |
| 274 } |
278 } |
| |
279 |
| |
280 |
| |
281 /* --------------------------- Link Button --------------------------- */ |
| |
282 |
| |
283 @implementation UiLinkButtonData |
| |
284 |
| |
285 - (id)init:(UiObject*)obj textfield:(NSTextField*)textfield { |
| |
286 _obj = obj; |
| |
287 _textfield = textfield; |
| |
288 return self; |
| |
289 } |
| |
290 |
| |
291 - (void)setLinkDataFromJson:(const char*)jsonStr { |
| |
292 CxJson json; |
| |
293 cxJsonInit(&json, NULL); |
| |
294 cxJsonFill(&json, jsonStr); |
| |
295 |
| |
296 CxJsonValue *value; |
| |
297 if(cxJsonNext(&json, &value) == CX_JSON_NO_ERROR) { |
| |
298 if(cxJsonIsObject(value)) { |
| |
299 CxJsonValue *label = cxJsonObjGet(value, "label"); |
| |
300 CxJsonValue *uri = cxJsonObjGet(value, "uri"); |
| |
301 CxJsonValue *visited = cxJsonObjGet(value, "visited"); |
| |
302 if(label) { |
| |
303 char *str = cxJsonIsString(label) ? cxJsonAsString(label) : NULL; |
| |
304 if(str) { |
| |
305 _label = [[NSString alloc]initWithUTF8String:str]; |
| |
306 } else { |
| |
307 _label = nil; |
| |
308 } |
| |
309 } |
| |
310 if(uri) { |
| |
311 char *str = cxJsonIsString(uri) ? cxJsonAsString(uri) : NULL; |
| |
312 if(str) { |
| |
313 _uri = [[NSString alloc]initWithUTF8String:str]; |
| |
314 } else { |
| |
315 _uri = nil; |
| |
316 } |
| |
317 } |
| |
318 if(visited) { |
| |
319 _visited = cxJsonIsBool(visited) ? cxJsonAsBool(visited) : FALSE; |
| |
320 } |
| |
321 } |
| |
322 cxJsonValueFree(value); |
| |
323 } |
| |
324 cxJsonDestroy(&json); |
| |
325 |
| |
326 [self buildLink]; |
| |
327 } |
| |
328 |
| |
329 - (void)buildLink { |
| |
330 NSString *label = _label ? _label : @""; |
| |
331 |
| |
332 NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:label]; |
| |
333 [attrString beginEditing]; |
| |
334 if(_uri) { |
| |
335 [attrString addAttribute:NSLinkAttributeName value:_uri range:NSMakeRange(0, attrString.length)]; |
| |
336 } |
| |
337 [attrString addAttribute:NSForegroundColorAttributeName value:[NSColor systemBlueColor] range:NSMakeRange(0, attrString.length)]; |
| |
338 [attrString addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(0, attrString.length)]; |
| |
339 [attrString endEditing]; |
| |
340 |
| |
341 [_textfield setAttributedStringValue:attrString]; |
| |
342 } |
| |
343 |
| |
344 @end |
| |
345 |
| |
346 static char* create_linkbutton_jsonvalue(const char *label, const char *uri, UiBool include_null, UiBool visited, UiBool set_visited) { |
| |
347 CxJsonValue *obj = cxJsonCreateObj(NULL); |
| |
348 if(label) { |
| |
349 cxJsonObjPutString(obj, CX_STR("label"), label); |
| |
350 } else if(include_null) { |
| |
351 cxJsonObjPutLiteral(obj, CX_STR("label"), CX_JSON_NULL); |
| |
352 } |
| |
353 |
| |
354 if(uri) { |
| |
355 cxJsonObjPutString(obj, CX_STR("uri"), uri); |
| |
356 } else if(include_null) { |
| |
357 cxJsonObjPutLiteral(obj, CX_STR("uri"), CX_JSON_NULL); |
| |
358 } |
| |
359 |
| |
360 if(set_visited) { |
| |
361 cxJsonObjPutLiteral(obj, CX_STR("visited"), visited ? CX_JSON_TRUE : CX_JSON_FALSE); |
| |
362 } |
| |
363 |
| |
364 CxJsonWriter writer = cxJsonWriterCompact(); |
| |
365 CxBuffer buf; |
| |
366 cxBufferInit(&buf, NULL, 128, NULL, CX_BUFFER_AUTO_EXTEND); |
| |
367 cxJsonWrite(&buf, obj, (cx_write_func)cxBufferWrite, &writer); |
| |
368 cxJsonValueFree(obj); |
| |
369 cxBufferTerminate(&buf); |
| |
370 |
| |
371 return buf.space; |
| |
372 } |
| |
373 |
| |
374 UIWIDGET ui_linkbutton_create(UiObject *obj, UiLinkButtonArgs *args) { |
| |
375 NSTextField *label = [[NSTextField alloc] init]; |
| |
376 label.editable = NO; |
| |
377 label.bezeled = NO; |
| |
378 label.drawsBackground = NO; |
| |
379 label.allowsEditingTextAttributes = YES; |
| |
380 label.selectable = YES; |
| |
381 |
| |
382 UiLayout layout = UI_ARGS2LAYOUT(args); |
| |
383 ui_container_add(obj, label, &layout); |
| |
384 |
| |
385 UiLinkButtonData *data = [[UiLinkButtonData alloc]init:obj textfield:label]; |
| |
386 objc_setAssociatedObject(label, "linkdata", data, OBJC_ASSOCIATION_RETAIN); |
| |
387 |
| |
388 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); |
| |
389 if(var) { |
| |
390 UiString *s = var->value; |
| |
391 s->obj = (__bridge void*)data; |
| |
392 s->get = ui_linkbutton_get; |
| |
393 s->set = ui_linkbutton_set; |
| |
394 |
| |
395 if(s->value.ptr) { |
| |
396 [data setLinkDataFromJson:s->value.ptr]; |
| |
397 } |
| |
398 } |
| |
399 |
| |
400 return (__bridge void*)label; |
| |
401 } |
| |
402 |
| |
403 char* ui_linkbutton_get(UiString *s) { |
| |
404 return NULL; // TODO |
| |
405 } |
| |
406 |
| |
407 void ui_linkbutton_set(UiString *s, const char *str) { |
| |
408 UiLinkButtonData *data = (__bridge UiLinkButtonData*)s->obj; |
| |
409 [data setLinkDataFromJson:str]; |
| |
410 } |
| |
411 |
| |
412 |
| |
413 |
| |
414 void ui_linkbutton_value_set(UiString *str, const char *label, const char *uri) { |
| |
415 char *value = create_linkbutton_jsonvalue(label, uri, TRUE, FALSE, TRUE); |
| |
416 ui_set(str, value); |
| |
417 free(value); |
| |
418 } |
| |
419 |
| |
420 void ui_linkbutton_value_set_label(UiString *str, const char *label) { |
| |
421 char *value = create_linkbutton_jsonvalue(label, NULL, FALSE, FALSE, TRUE); |
| |
422 ui_set(str, value); |
| |
423 free(value); |
| |
424 } |
| |
425 |
| |
426 void ui_linkbutton_value_set_uri(UiString *str, const char *uri) { |
| |
427 char *value = create_linkbutton_jsonvalue(NULL, uri, FALSE, FALSE, TRUE); |
| |
428 ui_set(str, value); |
| |
429 free(value); |
| |
430 } |
| |
431 |
| |
432 void ui_linkbutton_value_set_visited(UiString *str, UiBool visited) { |
| |
433 char *value = create_linkbutton_jsonvalue(NULL, NULL, FALSE, visited, TRUE); |
| |
434 ui_set(str, value); |
| |
435 free(value); |
| |
436 } |
| |
437 |
| |
438 // TODO |
| |
439 |
| |
440 void ui_linkbutton_set_label(UIWIDGET button, const char *label) { |
| |
441 |
| |
442 } |
| |
443 |
| |
444 void ui_linkbutton_set_uri(UIWIDGET button, const char *label) { |
| |
445 |
| |
446 } |
| |
447 |
| |
448 void ui_linkbutton_set_visited(UIWIDGET button, UiBool visited) { |
| |
449 |
| |
450 } |
| |
451 |
| |
452 char* ui_linkbutton_get_label(UIWIDGET button) { |
| |
453 return NULL; |
| |
454 } |
| |
455 |
| |
456 char* ui_linkbutton_get_uri(UIWIDGET button) { |
| |
457 return NULL; |
| |
458 } |
| |
459 |
| |
460 UiBool ui_linkbutton_get_visited(UIWIDGET button) { |
| |
461 return FALSE; |
| |
462 } |