use of org.csstudio.display.builder.model.WidgetDescriptor in project org.csstudio.display.builder by kasemir.
the class WidgetTransfer method installWidgetsFromString.
private static void installWidgetsFromString(final DragEvent event, final String text, final SelectedWidgetUITracker selection_tracker, final List<Widget> widgets) {
// Consider each word a separate PV
final String[] words = text.split("[ \n]+");
final boolean multiple = words.length > 1;
final List<WidgetDescriptor> descriptors = getPVWidgetDescriptors();
final List<String> choices = new ArrayList<>(descriptors.size() + (multiple ? 1 : 0));
final String format = multiple ? Messages.WT_FromString_multipleFMT : Messages.WT_FromString_singleFMT;
// Always offer a single LabelWidget for the complete text
final String defaultChoice = NLS.bind(Messages.WT_FromString_singleFMT, LabelWidget.WIDGET_DESCRIPTOR.getName());
choices.add(defaultChoice);
// When multiple words were dropped, offer multiple label widgets
if (multiple) {
choices.add(NLS.bind(Messages.WT_FromString_multipleFMT, LabelWidget.WIDGET_DESCRIPTOR.getName()));
}
choices.addAll(descriptors.stream().map(d -> NLS.bind(format, d.getName())).collect(Collectors.toList()));
Collections.sort(choices);
final ChoiceDialog<String> dialog = new ChoiceDialog<>(defaultChoice, choices);
dialog.setX(event.getScreenX() - 100);
dialog.setY(event.getScreenY() - 200);
dialog.setTitle(Messages.WT_FromString_dialog_title);
dialog.setHeaderText(NLS.bind(Messages.WT_FromString_dialog_headerFMT, reduceStrings(words)));
dialog.setContentText(Messages.WT_FromString_dialog_content);
final Optional<String> result = dialog.showAndWait();
if (!result.isPresent()) {
return;
}
final String choice = result.get();
if (defaultChoice.equals(choice)) {
logger.log(Level.FINE, "Dropped text: created LabelWidget [{0}].", text);
// Not a valid XML. Instantiate a Label object.
final LabelWidget widget = (LabelWidget) LabelWidget.WIDGET_DESCRIPTOR.createWidget();
widget.propText().setValue(text);
widgets.add(widget);
} else {
// Parse selection back into widget descriptor
final MessageFormat msgf = new MessageFormat(format);
final String descriptorName;
try {
descriptorName = msgf.parse(choice)[0].toString();
} catch (Exception ex) {
logger.log(Level.SEVERE, "Cannot parse selected widget type " + choice, ex);
return;
}
WidgetDescriptor descriptor = null;
if (LabelWidget.WIDGET_DESCRIPTOR.getName().equals(descriptorName)) {
descriptor = LabelWidget.WIDGET_DESCRIPTOR;
} else {
descriptor = descriptors.stream().filter(d -> descriptorName.equals(d.getName())).findFirst().orElse(null);
}
if (descriptor == null) {
logger.log(Level.SEVERE, "Cannot obtain widget for " + descriptorName);
return;
}
for (String word : words) {
final Widget widget = descriptor.createWidget();
logger.log(Level.FINE, "Dropped text: created {0} [{1}].", new Object[] { widget.getClass().getSimpleName(), word });
if (widget instanceof PVWidget) {
((PVWidget) widget).propPVName().setValue(word);
} else if (widget instanceof LabelWidget) {
((LabelWidget) widget).propText().setValue(word);
} else {
logger.log(Level.WARNING, "Unexpected widget type [{0}].", widget.getClass().getSimpleName());
}
final int index = widgets.size();
if (index > 0) {
// Place widgets below each other
final Widget previous = widgets.get(index - 1);
int x = previous.propX().getValue();
int y = previous.propY().getValue() + previous.propHeight().getValue();
// Align (if enabled)
final Point2D pos = selection_tracker.gridConstrain(x, y);
widget.propX().setValue((int) pos.getX());
widget.propY().setValue((int) pos.getY());
}
widgets.add(widget);
}
}
}
use of org.csstudio.display.builder.model.WidgetDescriptor in project org.csstudio.display.builder by kasemir.
the class MorphWidgetMenuSupport method createMenuManager.
private MenuManager createMenuManager() {
final MenuManager mm = new MenuManager(Messages.ReplaceWith);
mm.setRemoveAllWhenShown(true);
mm.addMenuListener((manager) -> {
if (editor.getWidgetSelectionHandler().getSelection().isEmpty())
manager.add(new Action(Messages.ReplaceWith_NoWidgets) {
});
else {
// Create menu that lists all widget types
WidgetCategory category = null;
for (WidgetDescriptor descr : WidgetFactory.getInstance().getWidgetDescriptions()) {
if (Preferences.getHiddenWidgets().contains(descr.getType()))
continue;
// Header for start of each category
if (descr.getCategory() != category) {
category = descr.getCategory();
// Use disabled, empty action to show category name
final Action info = new Action(category.getDescription()) {
};
info.setEnabled(false);
manager.add(new Separator());
manager.add(info);
}
manager.add(new MorphAction(descr));
}
}
});
mm.setImageDescriptor(Plugin.getIcon("replace.png"));
return mm;
}
Aggregations