Crossfire JXClient, Trunk
JXCSkinLoader.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.skin.io;
24 
154 import java.awt.Color;
155 import java.awt.Component;
156 import java.awt.Container;
157 import java.awt.Font;
158 import java.awt.Image;
159 import java.awt.image.BufferedImage;
160 import java.io.IOException;
161 import java.io.InputStream;
162 import java.io.InputStreamReader;
163 import java.io.LineNumberReader;
164 import java.nio.charset.StandardCharsets;
165 import java.util.ArrayList;
166 import java.util.Collection;
167 import java.util.Comparator;
168 import java.util.List;
169 import java.util.TreeSet;
170 import javax.swing.GroupLayout;
171 import javax.swing.GroupLayout.Group;
172 import javax.swing.GroupLayout.SequentialGroup;
173 import javax.swing.SwingConstants;
174 import org.jetbrains.annotations.NotNull;
175 import org.jetbrains.annotations.Nullable;
176 
182 public class JXCSkinLoader {
183 
189  private enum ListType {
190 
195 
200 
205 
210 
215 
220 
224  KNOWLEDGE_LIST
225  }
226 
230  @NotNull
231  private final Model model;
232 
236  @NotNull
237  private final NewCharModel newCharModel;
238 
242  @NotNull
244 
248  @NotNull
249  private final FloorView floorView;
250 
254  @NotNull
255  private final SpellsView spellView;
256 
260  @NotNull
262 
266  @NotNull
267  private final QuestsView questView;
268 
269  @NotNull
271 
272  @NotNull
274 
279  private final boolean avoidCopyArea;
280 
284  @NotNull
285  private final GuiFactory guiFactory;
286 
290  @NotNull
292 
296  @NotNull
297  private final String soundsCredits;
298 
302  @NotNull
303  private final FacesManager facesManager;
304 
308  private final int defaultTileSize;
309 
313  @NotNull
315 
319  @NotNull
320  private final GuiManager guiManager;
321 
326  @NotNull
328 
332  @NotNull
334 
338  @NotNull
340 
344  @NotNull
346 
350  private final float fontScaleFactor;
351 
355  @NotNull
357 
361  @NotNull
362  private final JXCSkinCache<Font> definedFonts = new JXCSkinCache<>("font");
363 
367  @Nullable
369 
373  @Nullable
375 
379  @Nullable
381 
386  @Nullable
388 
392  @NotNull
394 
398  @NotNull
400 
404  @NotNull
406 
410  @NotNull
412 
416  @NotNull
418 
423  @NotNull
424  private final List<ActivatableGUIElement> focusOrder = new ArrayList<>();
425 
429  @NotNull
431 
436  @NotNull
438 
443  @NotNull
444  private static final Comparator<GUIElement> ELEMENT_COMPARATOR = (o1, o2) -> {
445  final Comparable<String> n1 = o1.getName();
446  final String n2 = o2.getName();
447  return n1.compareTo(n2);
448  };
449 
453  @NotNull
455 
481  public JXCSkinLoader(@NotNull final Model model, @NotNull final InventoryView inventoryView, @NotNull final FloorView floorView, @NotNull final SpellsView spellView, @NotNull final SpellSkillView spellSkillsView, @NotNull final FacesManager facesManager, @NotNull final MapUpdaterState mapUpdaterState, @NotNull final KeyBindings defaultKeyBindings, @NotNull final OptionManager optionManager, final int defaultTileSize, @NotNull final KeybindingsManager keybindingsManager, @NotNull final QuestsView questView, @NotNull final CommandHistoryFactory commandHistoryFactory, @NotNull final KnowledgeView knowledgeView, @NotNull final KnowledgeTypeView knowledgeTypeView, final boolean avoidCopyArea, @NotNull final GuiManager guiManager, @NotNull final GuiFactory guiFactory, @NotNull final PendingDirections pendingDirections, @NotNull final String soundsCredits, final float fontScaleFactor) {
482  this.model = model;
483  this.inventoryView = inventoryView;
484  this.floorView = floorView;
485  this.spellView = spellView;
486  this.spellSkillsView = spellSkillsView;
487  this.facesManager = facesManager;
488  this.defaultTileSize = defaultTileSize;
489  this.commandHistoryFactory = commandHistoryFactory;
490  this.guiManager = guiManager;
492  this.mapUpdaterState = mapUpdaterState;
493  this.defaultKeyBindings = defaultKeyBindings;
494  this.optionManager = optionManager;
495  this.keybindingsManager = keybindingsManager;
496  this.questView = questView;
497  this.knowledgeView = knowledgeView;
498  this.knowledgeTypeView = knowledgeTypeView;
499  this.avoidCopyArea = avoidCopyArea;
500  this.guiFactory = guiFactory;
501  this.pendingDirections = pendingDirections;
502  newCharModel = new NewCharModel(this.model.getNewCharacterInformation());
503  this.soundsCredits = soundsCredits;
504  this.fontScaleFactor = fontScaleFactor;
505  }
506 
526  @NotNull
527  public JXCSkin load(@NotNull final JXCSkinSource skinSource, @NotNull final CrossfireServerConnection crossfireServerConnection, @NotNull final GuiStateManager guiStateManager, @NotNull final TooltipManager tooltipManager, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final GUIElementListener elementListener, @NotNull final MetaserverModel metaserverModel, @NotNull final CharacterModel characterModel, @NotNull final CommandQueue commandQueue, @NotNull final Shortcuts shortcuts, @NotNull final CommandExecutor commandExecutor, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros, @NotNull final SmoothFaces smoothFaces) throws JXCSkinException {
528  imageParser = new ImageParser(skinSource);
529  fontParser = new FontParser(skinSource);
530 
531  final Image nextGroupFace;
532  try {
533  nextGroupFace = ResourceUtils.loadImage(ResourceUtils.NEXT_GROUP_FACE).getImage();
534  } catch (final IOException ex) {
535  throw new JXCSkinException(ex.getMessage(), ex);
536  }
537  final Image prevGroupFace;
538  try {
539  prevGroupFace = ResourceUtils.loadImage(ResourceUtils.PREV_GROUP_FACE).getImage();
540  } catch (final IOException ex) {
541  throw new JXCSkinException(ex.getMessage(), ex);
542  }
543 
544  final Dialogs dialogs = new Dialogs(guiFactory, guiManager);
548  @Nullable JXCSkin skinToDetach = skin;
549  try {
551  imageParser.clear();
552  skin.addDialog("keybind");
553  skin.addDialog("query");
554  skin.addDialog("book");
555  skin.addDialog("main");
556  skin.addDialog("meta");
557  skin.addDialog("quit");
558  skin.addDialog("disconnect");
559  skin.addDialog("connect");
560  skin.addDialog("start");
561  skin.addDialog("account_login");
562  skin.addDialog("account_characters");
564  textButtonFactory = null;
565  dialogFactory = null;
566  checkBoxFactory = null;
567  try {
568  load(skinSource, "global", crossfireServerConnection, guiStateManager, tooltipManager, windowRenderer, elementListener, metaserverModel, characterModel, commandQueue, null, shortcuts, commandExecutor, commandCallback, macros, nextGroupFace, prevGroupFace, smoothFaces);
569  while (true) {
570  final String name = skin.getDialogToLoad();
571  if (name == null) {
572  break;
573  }
574  final Gui gui = skin.getDialog(name);
575  load(skinSource, name, crossfireServerConnection, guiStateManager, tooltipManager, windowRenderer, elementListener, metaserverModel, characterModel, commandQueue, gui, shortcuts, commandExecutor, commandCallback, macros, nextGroupFace, prevGroupFace, smoothFaces);
576  }
577  } finally {
579  textButtonFactory = null;
580  dialogFactory = null;
581  checkBoxFactory = null;
582  imageParser.clear();
583  }
584 
585  skinToDetach = null;
586  } finally {
587  if (skinToDetach != null) {
588  skinToDetach.detach();
589  windowRenderer.setTooltip(null);
590  }
591  }
592 
593  return skin;
594  }
595 
619  private void load(@NotNull final JXCSkinSource skinSource, @NotNull final String dialogName, @NotNull final CrossfireServerConnection server, @NotNull final GuiStateManager guiStateManager, @NotNull final TooltipManager tooltipManager, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final GUIElementListener elementListener, @NotNull final MetaserverModel metaserverModel, @NotNull final CharacterModel characterModel, @NotNull final CommandQueue commandQueue, @Nullable final Gui gui, @NotNull final Shortcuts shortcuts, @NotNull final CommandExecutor commandExecutor, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros, @NotNull final Image nextGroupFace, @NotNull final Image prevGroupFace, @NotNull final SmoothFaces smoothFaces) throws JXCSkinException {
620  String resourceName = dialogName+".skin";
621 
622  definedGUIElements.clear();
623  focusOrder.clear();
624  try {
625  InputStream inputStream;
626  try {
627  inputStream = skinSource.getInputStream(resourceName);
628  } catch (final IOException ignored) {
629  resourceName = dialogName+".skin";
630  inputStream = skinSource.getInputStream(resourceName);
631  }
632  try {
633  load(skinSource, dialogName, resourceName, inputStream, server, guiStateManager, tooltipManager, windowRenderer, elementListener, metaserverModel, characterModel, commandQueue, gui, shortcuts, commandExecutor, commandCallback, macros, nextGroupFace, prevGroupFace, smoothFaces);
634  } finally {
635  inputStream.close();
636  }
637  } catch (final IOException|JXCSkinException ex) {
638  throw new JXCSkinException(skinSource.getURI(resourceName)+": "+ex.getMessage(), ex);
639  } finally {
640  definedGUIElements.clear();
641  focusOrder.clear();
642  }
643  }
644 
671  private void load(@NotNull final JXCSkinSource skinSource, @NotNull final String dialogName, @NotNull final String resourceName, @NotNull final InputStream inputStream, @NotNull final CrossfireServerConnection server, @NotNull final GuiStateManager guiStateManager, @NotNull final TooltipManager tooltipManager, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final GUIElementListener elementListener, @NotNull final MetaserverModel metaserverModel, @NotNull final CharacterModel characterModel, @NotNull final CommandQueue commandQueue, @Nullable final Gui gui, @NotNull final Shortcuts shortcuts, @NotNull final CommandExecutor commandExecutor, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros, @NotNull final Image nextGroupFace, @NotNull final Image prevGroupFace, @NotNull final SmoothFaces smoothFaces) throws JXCSkinException {
672  try {
673  try (InputStreamReader isr = new InputStreamReader(inputStream, StandardCharsets.UTF_8)) {
674  try (LineNumberReader lnr = new LineNumberReader(isr)) {
675  try {
676  boolean isDialog = false;
677  while (true) {
678  final String line = lnr.readLine();
679  if (line == null) {
680  break;
681  }
682 
683  if (line.startsWith("#") || line.isEmpty()) {
684  continue;
685  }
686 
687  final String[] argsTmp;
688  try {
689  argsTmp = StringUtils.splitFields(line);
690  } catch (final UnterminatedTokenException ex) {
691  throw new JXCSkinException(ex.getMessage(), ex);
692  }
693  final Args args = new Args(argsTmp);
694  final String cmd = args.get();
695  if (gui != null && cmd.equals("button")) {
696  parseButton(args, tooltipManager, elementListener, lnr);
697  } else if (gui != null && cmd.equals("selectable_button")) {
698  parseSelectableButton(args, tooltipManager, elementListener, lnr);
699  } else if (gui != null && cmd.equals("checkbox")) {
700  parseCheckbox(args, tooltipManager, elementListener, lnr);
701  } else if (gui != null && cmd.equals("combobox")) {
702  parseComboBox(args, tooltipManager, elementListener);
703  } else if (gui != null && cmd.equals("spinner")) {
704  parseSpinner(args, tooltipManager, elementListener);
705  } else if (cmd.equals("commandlist")) {
706  parseCommandList(args, guiStateManager, lnr, commandExecutor, commandQueue, server, commandCallback, macros);
707  } else if (cmd.equals("commandlist_add")) {
708  parseCommandListAdd(args, guiStateManager, lnr, commandExecutor, commandQueue, server, commandCallback, macros);
709  } else if (gui != null && cmd.equals("command_text")) {
710  parseCommandText(args, commandCallback, tooltipManager, elementListener, commandExecutor, server);
711  } else if (cmd.equals("def")) {
712  parseDef(args, lnr);
713  } else if (gui != null && cmd.equals("dialog")) {
714  if (isDialog) {
715  throw new JXCSkinException("'dialog' must not be used more than once per dialog");
716  }
717  parseDialog(args, tooltipManager, windowRenderer, elementListener, lnr, gui, dialogName);
718  isDialog = true;
719  } else if (gui != null && cmd.equals("dialog_hide")) {
720  parseDialogHide(args, gui);
721  } else if (gui != null && cmd.equals("dupgauge")) {
722  parseDupGauge(args, tooltipManager, elementListener, lnr);
723  } else if (cmd.equals("event")) {
724  parseEvent(args, guiStateManager, server);
725  } else if (gui != null && cmd.equals("fill")) {
726  parseFill(args, tooltipManager, elementListener);
727  } else if (cmd.equals("font")) {
728  parseFont(args);
729  } else if (gui != null && cmd.equals("gauge")) {
730  parseGauge(args, tooltipManager, elementListener, lnr);
731  } else if (gui != null && cmd.equals("ignore")) {
732  parseIgnore(args);
733  } else if (gui != null && cmd.equals("inventory_list")) {
734  parseList(args, ListType.INVENTORY, tooltipManager, elementListener, commandQueue, server, nextGroupFace, prevGroupFace);
735  } else if (gui != null && cmd.equals("floor_list")) {
736  parseList(args, ListType.GROUND, tooltipManager, elementListener, commandQueue, server, nextGroupFace, prevGroupFace);
737  } else if (gui != null && cmd.equals("spells_list")) {
738  parseList(args, ListType.SPELL, tooltipManager, elementListener, commandQueue, server, nextGroupFace, prevGroupFace);
739  } else if (gui != null && cmd.equals("spell_skills")) {
740  parseList(args, ListType.SPELL_SKILLS, tooltipManager, elementListener, commandQueue, server, nextGroupFace, prevGroupFace);
741  } else if (gui != null && cmd.equals("quests_list")) {
742  parseList(args, ListType.QUEST, tooltipManager, elementListener, commandQueue, server, nextGroupFace, prevGroupFace);
743  } else if (gui != null && cmd.equals("knowledge_types")) {
744  parseList(args, ListType.KNOWLEDGE_TYPES, tooltipManager, elementListener, commandQueue, server, nextGroupFace, prevGroupFace);
745  } else if (gui != null && cmd.equals("knowledge_list")) {
746  parseList(args, ListType.KNOWLEDGE_LIST, tooltipManager, elementListener, commandQueue, server, nextGroupFace, prevGroupFace);
747  } else if (gui != null && cmd.equals("horizontal")) {
748  parseHorizontal(args, gui.getComponent(), lnr, isDialog);
749  } else if (gui != null && cmd.equals("item")) {
750  parseItem(args, tooltipManager, elementListener, commandQueue, commandExecutor, server, shortcuts, nextGroupFace, prevGroupFace);
751  } else if (cmd.equals("key")) {
752  parseKey(args, gui, line);
753  } else if (gui != null && cmd.equals("label_html")) {
754  parseLabelHtml(args, tooltipManager, elementListener, lnr);
755  } else if (gui != null && cmd.equals("label_multi")) {
756  parseLabelMulti(args, tooltipManager, elementListener, lnr);
757  } else if (gui != null && cmd.equals("label_query")) {
758  parseLabelQuery(args, tooltipManager, elementListener, server);
759  } else if (gui != null && cmd.equals("label_failure")) {
760  parseLabelFailure(args, tooltipManager, elementListener, server);
761  } else if (gui != null && cmd.equals("label_message")) {
762  parseLabelMessage(args, tooltipManager, elementListener, server, windowRenderer);
763  } else if (gui != null && cmd.equals("label_text")) {
764  parseLabelText(args, tooltipManager, elementListener, lnr);
765  } else if (gui != null && cmd.equals("label_stat")) {
766  parseLabelStat(args, tooltipManager, elementListener);
767  } else if (gui != null && cmd.equals("label_stat2")) {
768  parseLabelStat2(args, tooltipManager, elementListener);
769  } else if (gui != null && cmd.equals("label_newchar")) {
770  parseLabelNewchar(args, tooltipManager, elementListener, server);
771  } else if (gui != null && cmd.equals("label_sounds_credits")) {
772  parseLabelSoundsCredits(args, tooltipManager, elementListener);
773  } else if (gui != null && cmd.equals("link_size")) {
774  parseLinkSize(args, gui.getComponent());
775  } else if (gui != null && cmd.equals("log_label")) {
776  parseLogLabel(args, tooltipManager, elementListener);
777  } else if (gui != null && cmd.equals("log_message")) {
778  parseLogMessage(args, tooltipManager, elementListener, server);
779  } else if (gui != null && cmd.equals("log_color")) {
780  parseLogColor(args);
781  } else if (gui != null && cmd.equals("log_filter")) {
782  parseLogFilter(args);
783  } else if (gui != null && cmd.equals("minimap")) {
784  parseMinimap(args, tooltipManager, elementListener);
785  } else if (gui != null && cmd.equals("map")) {
786  parseMap(args, tooltipManager, elementListener, server, smoothFaces);
787  } else if (gui != null && cmd.equals("map_directions")) {
788  parseMapDirections(args, tooltipManager, elementListener, smoothFaces);
789  } else if (gui != null && cmd.equals("meta_list")) {
790  parseMetaList(args, tooltipManager, elementListener, metaserverModel);
791  } else if (gui != null && cmd.equals("picture")) {
792  parsePicture(args, tooltipManager, elementListener, lnr, gui, false);
793  } else if (gui != null && cmd.equals("picture_scaled")) {
794  parsePicture(args, tooltipManager, elementListener, lnr, gui, true);
795  } else if (gui != null && cmd.equals("picture_stat")) {
796  parsePictureStat(args, tooltipManager, elementListener, lnr);
797  } else if (gui != null && cmd.equals("query_text")) {
798  parseQueryText(args, server, commandCallback, tooltipManager, elementListener);
799  } else if (gui != null && cmd.equals("set_forced_active")) {
800  parseSetForcedActive(args, gui);
801  } else if (gui != null && cmd.equals("set_auto_size")) {
802  parseSetAutoSize(gui, args);
803  } else if (gui != null && cmd.equals("set_default")) {
804  parseSetDefault(args);
805  } else if (gui != null && cmd.equals("set_invisible")) {
806  parseSetInvisible(args);
807  } else if (gui != null && cmd.equals("set_modal")) {
808  parseSetModal(gui);
809  } else if (gui != null && cmd.equals("set_user_resizable")) {
811  } else if (gui != null && cmd.equals("scrollbar")) {
812  parseScrollbar(args, tooltipManager, elementListener);
813  } else if (gui == null && cmd.equals("skin_name")) {
814  parseSkinName(args);
815  } else if (gui != null && cmd.equals("text")) {
816  parseText(args, commandCallback, tooltipManager, elementListener);
817  } else if (gui != null && cmd.equals("textbutton")) {
818  parseTextButton(args, tooltipManager, elementListener, lnr);
819  } else if (gui != null && cmd.equals("textgauge")) {
820  parseTextGauge(args, tooltipManager, elementListener, lnr);
821  } else if (cmd.equals("tooltip")) {
822  parseTooltip(args, tooltipManager, elementListener);
823  } else if (gui != null && cmd.equals("vertical")) {
824  parseVertical(args, gui.getComponent(), lnr, isDialog);
825  } else if (cmd.equals("character_list")) {
826  parseCharacterList(args, tooltipManager, elementListener, characterModel);
827  } else if (cmd.equals("hide_input")) {
828  parseHideInput(args);
829  } else if (gui != null && cmd.equals("focus")) {
830  parseFocus(args, lnr);
831  } else {
832  throw new IOException("unknown keyword '"+cmd+"'");
833  }
834 
835  if (args.hasMore()) {
836  throw new IOException("excess arguments");
837  }
838  }
839  } catch (final IOException|JXCSkinException ex) {
840  throw new IOException(ex.getMessage()+" in line "+lnr.getLineNumber(), ex);
841  } catch (final IllegalArgumentException ex) {
842  final Object msg = ex.getMessage();
843  throw new IOException("invalid parameter"+(msg == null ? "" : " ("+msg+")")+" in line "+lnr.getLineNumber(), ex);
844  } finally {
845  lnr.close();
846  }
847  }
848  }
849 
850  if (gui != null) {
851  if (focusOrder.isEmpty()) {
852  for (GUIElement element : definedGUIElements) {
853  if (element instanceof ActivatableGUIElement) {
854  focusOrder.add((ActivatableGUIElement)element);
855  }
856  }
857  } else {
858  final Collection<GUIElement> unreferencedElements = new TreeSet<>(ELEMENT_COMPARATOR);
859  for (final GUIElement element : definedGUIElements) {
860  if (element instanceof ActivatableGUIElement) {
861  unreferencedElements.add(element);
862  }
863  }
864  unreferencedElements.removeAll(focusOrder);
865  if (!unreferencedElements.isEmpty()) {
866  throw new IOException("missing elements in focus block: "+unreferencedElements);
867  }
868  }
869  for (int i = 0; i < focusOrder.size(); i++) {
870  final ActivatableGUIElement prev = focusOrder.get(i);
871  final ActivatableGUIElement next = focusOrder.get((i+1)%focusOrder.size());
872  prev.setNextActive(next);
873  next.setPrevActive(prev);
874  }
875  }
876  } catch (final IOException ex) {
877  throw new JXCSkinException(skinSource.getURI(resourceName)+": "+ex.getMessage(), ex);
878  }
879 
880  assert gui != null || !definedGUIElements.iterator().hasNext();
881  }
882 
892  private void parseButton(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
893  final String name = args.get();
894  final BufferedImage upImage = scaleImage(imageParser.getImage(args.get()));
895  final BufferedImage downImage = scaleImage(imageParser.getImage(args.get()));
896  final boolean autoRepeat = NumberParser.parseBoolean(args.get());
897  final CommandList commandList = skin.getCommandList(args.get());
898  @Nullable final String label;
899  @Nullable final Font font;
900  @Nullable final Color color;
901  final int textX;
902  final int textY;
903  if (args.hasMore()) {
904  font = definedFonts.lookup(args.get());
905  color = ParseUtils.parseColor(args.get());
906  textX = ExpressionParser.parseInt(args.get());
907  textY = ExpressionParser.parseInt(args.get());
908  label = ParseUtils.parseText(args, lnr);
909  } else {
910  label = null;
911  font = null;
912  color = null;
913  textX = 0;
914  textY = 0;
915  }
916  insertGuiElement(new GUIButton(tooltipManager, elementListener, name, upImage, downImage, label, font, color, textX, textY, autoRepeat, commandList, guiFactory, newCharModel));
917  }
918 
928  private void parseSelectableButton(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
929  final String name = args.get();
930  final BufferedImage upImage = imageParser.getImage(args.get());
931  final BufferedImage downImage = imageParser.getImage(args.get());
932  final boolean autoRepeat = NumberParser.parseBoolean(args.get());
933  final CommandList commandList = skin.getCommandList(args.get());
934  final String tooltipText = ParseUtils.parseText(args, lnr);
935  insertGuiElement(new GUISelectableButton(tooltipManager, elementListener, name, upImage, downImage, tooltipText, autoRepeat, commandList, guiFactory, newCharModel));
936  }
937 
947  private void parseCheckbox(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
948  if (checkBoxFactory == null) {
949  throw new IOException("missing 'def checkbox' command");
950  }
951 
952  final String name = args.get();
953  final CheckBoxOption option = ParseUtils.parseCheckBoxOption(args.get(), optionManager);
954  final String text = ParseUtils.parseText(args, lnr);
955  assert checkBoxFactory != null;
956  insertGuiElement(checkBoxFactory.newCheckBox(tooltipManager, elementListener, name, option, text));
957  }
958 
967  private void parseComboBox(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
968  final String name = args.get();
969  final String type = args.get();
970  final GUILabelLog label = args.get().equals("null") ? null : guiElementParser.lookupLabelLogElement(args.getPrev());
971  final AbstractGUIElement element = switch (type) {
972  case "classes" -> new GUIClassesComboBox(tooltipManager, elementListener, name, model, newCharModel, label, guiFactory);
973  case "races" -> new GUIRacesComboBox(tooltipManager, elementListener, name, model, newCharModel, label, guiFactory);
974  case "starting_maps" -> new GUIStartingMapsComboBox(tooltipManager, elementListener, name, model, newCharModel, label, guiFactory);
975  case "char_options" -> new GUICharOptionsComboBox(tooltipManager, elementListener, name, newCharModel, label, guiFactory);
976  default -> throw new IOException("undefined 'combobox' type '"+type+"'");
977  };
978  insertGuiElement(element);
979  }
980 
989  private void parseSpinner(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
990  final String name = args.get();
991  final NewcharStat stat = NumberParser.parseEnum(NewcharStat.class, args.get(), "stat");
992  insertGuiElement(new GUISpinner(tooltipManager, elementListener, name, stat, newCharModel, guiFactory));
993  }
994 
1008  private void parseCommandList(@NotNull final Args args, @NotNull final GuiStateManager guiStateManager, @NotNull final LineNumberReader lnr, @NotNull final CommandExecutor commandExecutor, @NotNull final CommandQueue commandQueue, @NotNull final CrossfireServerConnection server, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros) throws IOException, JXCSkinException {
1009  final String commandListName = args.get();
1010  final CommandListType commandListType = NumberParser.parseEnum(CommandListType.class, args.get(), "type");
1011  skin.addCommandList(commandListName, commandListType);
1012  if (args.hasMore()) {
1013  final AbstractGUIElement element = args.get().equals("null") ? null : definedGUIElements.lookup(args.getPrev());
1014  addCommand(commandListName, args, element, args.get(), guiStateManager, commandExecutor, lnr, commandQueue, server, commandCallback, macros);
1015  }
1016  }
1017 
1031  private void parseCommandListAdd(@NotNull final Args args, @NotNull final GuiStateManager guiStateManager, @NotNull final LineNumberReader lnr, @NotNull final CommandExecutor commandExecutor, @NotNull final CommandQueue commandQueue, @NotNull final CrossfireServerConnection server, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros) throws IOException, JXCSkinException {
1032  final String name = args.get();
1033  final AbstractGUIElement element = args.get().equals("null") ? null : definedGUIElements.lookup(args.getPrev());
1034  addCommand(name, args, element, args.get(), guiStateManager, commandExecutor, lnr, commandQueue, server, commandCallback, macros);
1035  }
1036 
1048  private void parseCommandText(@NotNull final Args args, @NotNull final CommandCallback commandCallback, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CommandExecutor commandExecutor, @NotNull final CrossfireServerConnection crossfireServerConnection) throws IOException, JXCSkinException {
1049  final String name = args.get();
1050  final Image activeImage = imageParser.getImage(args.get());
1051  final Image inactiveImage = imageParser.getImage(args.get());
1052  final Font font = definedFonts.lookup(args.get());
1053  final Color inactiveColor = ParseUtils.parseColor(args.get());
1054  final Color activeColor = ParseUtils.parseColor(args.get());
1055  final int margin = ExpressionParser.parseInt(args.get());
1056  final boolean enableHistory = NumberParser.parseBoolean(args.get());
1057  final CommandHistory commandHistory = enableHistory ? commandHistoryFactory.getCommandHistory(name) : null;
1058  insertGuiElement(new GUICommandText(commandCallback, commandHistory, tooltipManager, elementListener, name, newCharModel, activeImage, inactiveImage, font, inactiveColor, activeColor, margin, "", commandExecutor, guiFactory, crossfireServerConnection));
1059  }
1060 
1068  private void parseDef(@NotNull final Args args, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
1069  final String type = args.get();
1070  switch (type) {
1071  case "checkbox": {
1072  final BufferedImage checkedImage = scaleImage(imageParser.getImage(args.get()));
1073  final BufferedImage uncheckedImage = scaleImage(imageParser.getImage(args.get()));
1074  final Font font = definedFonts.lookup(args.get());
1075  final Color color = ParseUtils.parseColor(args.get());
1076  checkBoxFactory = new CheckBoxFactory(checkedImage, uncheckedImage, font, color, guiFactory);
1077  break;
1078  }
1079 
1080  case "checkbox_option":
1081  final String optionName = args.get();
1082  final boolean defaultValue = NumberParser.parseBoolean(args.get());
1083  final CommandList commandOn = skin.getCommandList(args.get());
1084  final CommandList commandOff = skin.getCommandList(args.get());
1085  final String documentation = ParseUtils.parseText(args, lnr);
1086  skin.addOption(optionName, documentation, new CommandCheckBoxOption(defaultValue, commandOn, commandOff, documentation));
1087  break;
1088 
1089  case "dialog":
1090  final String frame = args.get();
1091  final Image frameNW = imageParser.getImage(frame+"_nw");
1092  final Image frameN = imageParser.getImage(frame+"_n");
1093  final Image frameNE = imageParser.getImage(frame+"_ne");
1094  final Image frameW = imageParser.getImage(frame+"_w");
1095  final Image frameC = imageParser.getImage(frame+"_c");
1096  final Image frameE = imageParser.getImage(frame+"_e");
1097  final Image frameSW = imageParser.getImage(frame+"_sw");
1098  final Image frameS = imageParser.getImage(frame+"_s");
1099  final Image frameSE = imageParser.getImage(frame+"_se");
1100  final Font titleFont = definedFonts.lookup(args.get());
1101  final Color titleColor = ParseUtils.parseColor(args.get());
1102  final Color titleBackgroundColor = ParseUtils.parseColor(args.get());
1103  final float alpha = NumberParser.parseFloat(args.get());
1104  if (alpha < 0 || alpha > 1.0F) {
1105  throw new IOException("invalid alpha value: "+alpha);
1106  }
1107  dialogFactory = new DialogFactory(frameNW, frameN, frameNE, frameW, frameC, frameE, frameSW, frameS, frameSE, titleFont, titleColor, titleBackgroundColor, alpha, guiFactory);
1108  break;
1109 
1110  case "item": {
1111  final Color cursedColor = ParseUtils.parseColorNull(args.get());
1112  final Image cursedImage = imageParser.getImage(cursedColor, args.getPrev());
1113  final Color damnedColor = ParseUtils.parseColorNull(args.get());
1114  final Image damnedImage = imageParser.getImage(damnedColor, args.getPrev());
1115  final Color magicColor = ParseUtils.parseColorNull(args.get());
1116  final Image magicImage = imageParser.getImage(magicColor, args.getPrev());
1117  final Color blessedColor = ParseUtils.parseColorNull(args.get());
1118  final Image blessedImage = imageParser.getImage(blessedColor, args.getPrev());
1119  final Color appliedColor = ParseUtils.parseColorNull(args.get());
1120  final Image appliedImage = imageParser.getImage(appliedColor, args.getPrev());
1121  final Color unidentifiedColor = ParseUtils.parseColorNull(args.get());
1122  final Image unidentifiedImage = imageParser.getImage(unidentifiedColor, args.getPrev());
1123  final Color selectorColor = ParseUtils.parseColorNull(args.get());
1124  final Image selectorImage = imageParser.getImage(selectorColor, args.getPrev());
1125  final Color lockedColor = ParseUtils.parseColorNull(args.get());
1126  final Image lockedImage = imageParser.getImage(lockedColor, args.getPrev());
1127  final Color unpaidColor = ParseUtils.parseColorNull(args.get());
1128  final Image unpaidImage = imageParser.getImage(unpaidColor, args.getPrev());
1129  final Color markedColor = ParseUtils.parseColorNull(args.get());
1130  final Image markedImage = imageParser.getImage(unpaidColor, args.getPrev());
1131  final Font font = definedFonts.lookup(args.get());
1132  final Color nrofColor = ParseUtils.parseColor(args.get());
1133  defaultItemPainter = new ItemPainter(cursedImage, damnedImage, magicImage, blessedImage, appliedImage, unidentifiedImage, selectorImage, lockedImage, unpaidImage, markedImage, cursedColor, damnedColor, magicColor, blessedColor, appliedColor, unidentifiedColor, selectorColor, lockedColor, unpaidColor, markedColor, font, nrofColor);
1134  break;
1135  }
1136 
1137  case "textbutton":
1138  final String up = args.get();
1139  final String down = args.get();
1140  final Font font = definedFonts.lookup(args.get());
1141  final Color color = ParseUtils.parseColor(args.get());
1142  final Color colorSelected = ParseUtils.parseColor(args.get());
1143  final Color colorDisabled = ParseUtils.parseColor(args.get());
1144  final BufferedImage upImageLeft = scaleImage(imageParser.getImage(up+"_w"));
1145  final BufferedImage upImageMiddle = scaleImage(imageParser.getImage(up+"_c"));
1146  final BufferedImage upImageRight = scaleImage(imageParser.getImage(up+"_e"));
1147  final ButtonImages upImages = new ButtonImages(upImageLeft, upImageMiddle, upImageRight);
1148  final BufferedImage downImageLeft = scaleImage(imageParser.getImage(down+"_w"));
1149  final BufferedImage downImageMiddle = scaleImage(imageParser.getImage(down+"_c"));
1150  final BufferedImage downImageRight = scaleImage(imageParser.getImage(down+"_e"));
1151  final ButtonImages downImages = new ButtonImages(downImageLeft, downImageMiddle, downImageRight);
1152  textButtonFactory = new TextButtonFactory(upImages, downImages, font, color, colorSelected, colorDisabled, guiFactory, newCharModel, keybindingsManager);
1153  break;
1154 
1155  default:
1156  throw new IOException("unknown type '"+type+"'");
1157  }
1158  }
1159 
1172  private void parseDialog(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr, @NotNull final Gui gui, @NotNull final String dialogName) throws IOException, JXCSkinException {
1173  if (dialogFactory == null) {
1174  throw new IOException("missing 'def dialog' command");
1175  }
1176 
1177  final Expression defaultX = ExpressionParser.parseExpression(args.get());
1178  final Expression defaultY = ExpressionParser.parseExpression(args.get());
1179  final boolean saveDialog = NumberParser.parseBoolean(args.get());
1180  final String title = ParseUtils.parseText(args, lnr);
1181  assert dialogFactory != null;
1182  final Iterable<AbstractGUIElement> elements = dialogFactory.newDialog(tooltipManager, windowRenderer, elementListener, title);
1183  for (AbstractGUIElement element : elements) {
1184  insertGuiElement(element);
1185  }
1186  gui.getComponent().setName(dialogName);
1187  gui.setDefaultPosition(defaultX, defaultY);
1188  if (saveDialog) {
1189  gui.setSaveDialog();
1190  }
1191  }
1192 
1199  private static void parseDialogHide(@NotNull final Args args, @NotNull final Gui gui) throws IOException {
1200  do {
1201  gui.hideInState(NumberParser.parseEnum(RendererGuiState.class, args.get(), "gui state"));
1202  } while (args.hasMore());
1203  }
1204 
1214  private void parseDupGauge(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
1215  final String name = args.get();
1216  final Image positiveDivImage = scaleImage(imageParser.getImage(args.get()));
1217  final Image positiveModImage = scaleImage(imageParser.getImage(args.get()));
1218  final Image emptyImage = scaleImage(imageParser.getImage(args.get()));
1219  final GaugeUpdater gaugeUpdater = newGaugeUpdater(args.get());
1220  final Orientation orientationDiv = ParseUtils.parseOrientation(args.get());
1221  final Orientation orientationMod = ParseUtils.parseOrientation(args.get());
1222  final Color color = ParseUtils.parseColor(args.get());
1223  final Font font = definedFonts.lookup(args.get());
1224  final CommandList commandList = args.get().equals("null") ? null : skin.getCommandList(args.getPrev());
1225  final String tooltipPrefix = ParseUtils.parseText(args, lnr);
1226  final GUIDupGauge element = new GUIDupGauge(tooltipManager, elementListener, name, positiveDivImage, positiveModImage, emptyImage, orientationDiv, orientationMod, tooltipPrefix.isEmpty() ? null : tooltipPrefix, color, font, commandList, guiFactory);
1227  insertGuiElement(element);
1228  gaugeUpdater.setGauge(element);
1229  }
1230 
1239  private void parseEvent(@NotNull final Args args, @NotNull final GuiStateManager guiStateManager, @NotNull final CrossfireServerConnection server) throws IOException, JXCSkinException {
1240  final String type = args.get();
1241  switch (type) {
1242  case "connect": {
1243  final CommandList commandList = skin.getCommandList(args.get());
1244  skin.addSkinEvent(new ConnectionStateSkinEvent(commandList, guiStateManager));
1245  break;
1246  }
1247 
1248  case "init":
1249  skin.addInitEvent(skin.getCommandList(args.get()));
1250  break;
1251 
1252  case "login": {
1253  final CommandList commandList = skin.getCommandList(args.get());
1254  skin.addSkinEvent(new PlayerLoginSkinEvent(true, commandList, model.getItemSet()));
1255  break;
1256  }
1257 
1258  case "logout": {
1259  final CommandList commandList = skin.getCommandList(args.get());
1260  skin.addSkinEvent(new PlayerLoginSkinEvent(false, commandList, model.getItemSet()));
1261  break;
1262  }
1263 
1264  case "magicmap": {
1265  final CommandList commandList = skin.getCommandList(args.get());
1266  skin.addSkinEvent(new CrossfireMagicmapSkinEvent(commandList, server));
1267  break;
1268  }
1269 
1270  case "mapscroll": {
1271  final CommandList commandList = skin.getCommandList(args.get());
1273  break;
1274  }
1275 
1276  case "skill":
1277  final String subtype = args.get();
1278  final Skill skill = model.getSkillSet().getNamedSkill(args.get().replace('_', ' '), -1);
1279  final CommandList commandList = skin.getCommandList(args.get());
1280  switch (subtype) {
1281  case "add":
1282  skin.addSkinEvent(new SkillAddedSkinEvent(commandList, skill));
1283  break;
1284 
1285  case "del":
1286  skin.addSkinEvent(new SkillRemovedSkinEvent(commandList, skill));
1287  break;
1288 
1289  default:
1290  throw new IOException("undefined event sub-type: "+subtype);
1291  }
1292  break;
1293 
1294  default:
1295  throw new IOException("undefined event type: "+type);
1296  }
1297  }
1298 
1307  private void parseFill(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
1308  final String name = args.get();
1309  final Color color = ParseUtils.parseColor(args.get());
1310  final float alpha = NumberParser.parseFloat(args.get());
1311  if (alpha < 0 || alpha > 1.0F) {
1312  throw new IOException("invalid alpha value: "+alpha);
1313  }
1314  insertGuiElement(new GUIFill(tooltipManager, elementListener, name, color, alpha, guiFactory));
1315  }
1316 
1323  private void parseFont(@NotNull final Args args) throws IOException, JXCSkinException {
1324  final String name = args.get();
1325  final Font fontNormal = fontParser.getFont(args.get());
1326  final Font font = fontNormal.deriveFont(NumberParser.parseFloat(args.get())*fontScaleFactor);
1327  definedFonts.insert(name, font);
1328  }
1329 
1339  private void parseGauge(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
1340  if (dialogFactory == null) {
1341  throw new IOException("missing 'def dialog' command");
1342  }
1343 
1344  final String name = args.get();
1345  final Image positiveImage = args.get().equals("null") ? null : imageParser.getImage(args.getPrev());
1346  final Image positiveLowImage = args.get().equals("null") ? null : imageParser.getImage(args.getPrev());
1347  final Image negativeImage = args.get().equals("null") ? null : imageParser.getImage(args.getPrev());
1348  final Image emptyImage = args.get().equals("null") ? null : imageParser.getImage(args.getPrev());
1349  final GaugeUpdater gaugeUpdater = newGaugeUpdater(args.get());
1350  final Orientation orientation = ParseUtils.parseOrientation(args.get());
1351  final CommandList commandList = args.get().equals("null") ? null : skin.getCommandList(args.getPrev());
1352  final String tooltipFormat = ParseUtils.parseText(args, lnr);
1353  assert dialogFactory != null;
1354  final float alpha = dialogFactory.getFrameAlpha();
1355  final GUIGauge element = new GUIGauge(tooltipManager, elementListener, name, positiveImage, positiveLowImage, negativeImage, emptyImage, orientation, tooltipFormat.isEmpty() ? null : tooltipFormat, alpha, commandList, guiFactory, model.getStats());
1356  insertGuiElement(element);
1357  gaugeUpdater.setGauge(element);
1358  }
1359 
1366  private void parseIgnore(@NotNull final Args args) throws IOException, JXCSkinException {
1367  final String name = args.get();
1368  definedGUIElements.lookup(name).setIgnore();
1369  }
1370 
1385  private void parseList(@NotNull final Args args, final ListType type, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CommandQueue commandQueue, @NotNull final CrossfireServerConnection server, @NotNull final Image nextGroupFace, @NotNull final Image prevGroupFace) throws IOException, JXCSkinException {
1386  if (defaultItemPainter == null) {
1387  throw new IOException("cannot use '"+type+"_list"+"' without 'def item' command");
1388  }
1389 
1390  final String name = args.get();
1391  final int cellWidth = ExpressionParser.parseInt(args.get());
1392  final int cellHeight = ExpressionParser.parseInt(args.get());
1393  final AbstractLabel selectedItem = args.get().equals("null") ? null : guiElementParser.lookupLabelElement(args.getPrev());
1394 
1395  assert defaultItemPainter != null;
1396  final ItemPainter itemPainter = defaultItemPainter.newItemPainter();
1397  final AbstractGUIElement element;
1398  switch (type) {
1399  case INVENTORY:
1400  element = new GUIInventoryList(tooltipManager, elementListener, name, cellWidth, cellHeight, inventoryView, selectedItem, commandQueue, itemPainter, server, facesManager, floorView, guiFactory);
1401  break;
1402 
1403  case GROUND:
1404  element = new GUIFloorList(tooltipManager, elementListener, name, cellWidth, cellHeight, floorView, selectedItem, commandQueue, itemPainter, server, facesManager, model.getItemSet(), nextGroupFace, prevGroupFace, guiFactory);
1405  break;
1406 
1407  case SPELL:
1408  element = new GUISpellList(tooltipManager, elementListener, name, cellWidth, cellHeight, spellView, selectedItem, model.getSpellsManager(), keybindingsManager, commandQueue, itemPainter, facesManager, guiFactory);
1409  break;
1410 
1411  case QUEST:
1412  element = new GUIQuestList(tooltipManager, elementListener, name, cellWidth, cellHeight, questView, selectedItem, model.getQuestsManager(), commandQueue, itemPainter, facesManager, guiFactory);
1413  break;
1414 
1415  case SPELL_SKILLS:
1417  element = new GUISpellSkillList(tooltipManager, elementListener, name, cellWidth, cellHeight, spellSkillsView, selectedItem, model.getSpellsManager(), itemPainter, facesManager, defaultSkillIcon, guiFactory);
1418  break;
1419 
1420  case KNOWLEDGE_TYPES:
1421  element = new GUIKnowledgeTypeList(tooltipManager, elementListener, name, cellWidth, cellHeight, knowledgeTypeView, selectedItem, model.getKnowledgeManager(), itemPainter, facesManager, guiFactory);
1422  break;
1423 
1424  case KNOWLEDGE_LIST:
1425  element = new GUIKnowledgeList(tooltipManager, elementListener, name, cellWidth, cellHeight, knowledgeView, selectedItem, itemPainter, facesManager, model.getKnowledgeManager(), commandQueue, guiFactory);
1426  break;
1427 
1428  default:
1429  throw new AssertionError("unhandled type "+type);
1430  }
1431  insertGuiElement(element);
1432  }
1433 
1443  private void parseHorizontal(@NotNull final Args args, @NotNull final Container gui, @NotNull final LineNumberReader lnr, final boolean isDialog) throws IOException, JXCSkinException {
1444  final GroupLayout layout = (GroupLayout)gui.getLayout();
1445  final String begin = args.get();
1446  if (!begin.equals("begin")) {
1447  throw new IOException("syntax error: expecting 'begin'");
1448  }
1449  final Collection<GUIElement> unreferencedElements = new TreeSet<>(ELEMENT_COMPARATOR);
1450  for (GUIElement element : definedGUIElements) {
1451  unreferencedElements.add(element);
1452  }
1453  if (!isDialog) {
1454  final Group content = parseBegin(args, layout, lnr, unreferencedElements, true);
1455  if (!unreferencedElements.isEmpty()) {
1456  throw new IOException("layout doesn't define elements "+unreferencedElements);
1457  }
1458  layout.setHorizontalGroup(content);
1459  return;
1460  }
1461  final AbstractGUIElement background = getUnreferencedElement("dialog_background", unreferencedElements);
1462  if (background == null) {
1463  throw new AssertionError("element 'dialog_background' is missing");
1464  }
1465  final Group content = parseBegin(args, layout, lnr, unreferencedElements, true);
1466  final Component title = getUnreferencedElement("dialog_title", unreferencedElements);
1467  final Component close = getUnreferencedElement("dialog_close", unreferencedElements);
1468  final Component help = getUnreferencedElement("dialog_help", unreferencedElements);
1469  final Group group2 = layout.createSequentialGroup();
1470  group2.addGap(background.getDialogBorderLeft());
1471  if (title == null) {
1472  if (help == null) {
1473  if (close == null) {
1474  // no title, no help, no close
1475  group2.addGroup(content);
1476  } else {
1477  // no title, no help, close
1478  final Group group3 = layout.createSequentialGroup();
1479  group3.addGap(0, 10, Short.MAX_VALUE);
1480  group3.addComponent(close);
1481  final Group group4 = layout.createParallelGroup();
1482  group4.addGroup(group3);
1483  group4.addGroup(content);
1484  group2.addGroup(group4);
1485  }
1486  } else {
1487  if (close == null) {
1488  // no title, help, no close
1489  final Group group3 = layout.createSequentialGroup();
1490  group3.addGap(0, 10, Short.MAX_VALUE);
1491  group3.addComponent(help);
1492  final Group group4 = layout.createParallelGroup();
1493  group4.addGroup(group3);
1494  group4.addGroup(content);
1495  group2.addGroup(group4);
1496  } else {
1497  // no title, help, close
1498  final Group group3 = layout.createSequentialGroup();
1499  group3.addGap(0, 10, Short.MAX_VALUE);
1500  group3.addComponent(help);
1501  group3.addComponent(close);
1502  final Group group4 = layout.createParallelGroup();
1503  group4.addGroup(group3);
1504  group4.addGroup(content);
1505  group2.addGroup(group4);
1506  }
1507  }
1508  } else {
1509  if (help == null) {
1510  if (close == null) {
1511  // title, no help, no close
1512  final Group group3 = layout.createParallelGroup();
1513  group3.addComponent(title);
1514  group3.addGroup(content);
1515  group2.addGroup(group3);
1516  } else {
1517  // title, no help, close
1518  final Group group3 = layout.createSequentialGroup();
1519  group3.addComponent(title);
1520  group3.addComponent(close);
1521  final Group group4 = layout.createParallelGroup();
1522  group4.addGroup(group3);
1523  group4.addGroup(content);
1524  group2.addGroup(group4);
1525  }
1526  } else {
1527  if (close == null) {
1528  // title, help, no close
1529  final Group group3 = layout.createSequentialGroup();
1530  group3.addComponent(title);
1531  group3.addComponent(help);
1532  final Group group4 = layout.createParallelGroup();
1533  group4.addGroup(group3);
1534  group4.addGroup(content);
1535  group2.addGroup(group4);
1536  } else {
1537  // title, help, close
1538  final Group group3 = layout.createSequentialGroup();
1539  group3.addComponent(title);
1540  group3.addComponent(help);
1541  group3.addComponent(close);
1542  final Group group4 = layout.createParallelGroup();
1543  group4.addGroup(group3);
1544  group4.addGroup(content);
1545  group2.addGroup(group4);
1546  }
1547  }
1548  }
1549  group2.addGap(background.getDialogBorderRight());
1550  if (!unreferencedElements.isEmpty()) {
1551  throw new IOException("layout doesn't define elements "+unreferencedElements);
1552  }
1553 
1554  final Group group1 = layout.createParallelGroup();
1555  group1.addGroup(group2);
1556  group1.addComponent(background);
1557 
1558  layout.setHorizontalGroup(group1);
1559  }
1560 
1567  @Nullable
1568  private AbstractGUIElement getUnreferencedElement(@NotNull final String name, @NotNull final Collection<GUIElement> unreferencedElements) {
1569  final AbstractGUIElement component = definedGUIElements.lookupOptional(name);
1570  if (component == null) {
1571  return null;
1572  }
1573 
1574  return unreferencedElements.remove(component) ? component : null;
1575  }
1576 
1591  private void parseItem(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CommandQueue commandQueue, @NotNull final CommandExecutor commandExecutor, @NotNull final CrossfireServerConnection server, @NotNull final Shortcuts shortcuts, @NotNull final Image nextGroupFace, @NotNull final Image prevGroupFace) throws IOException, JXCSkinException {
1592  final String type = args.get();
1593  final String name = args.get();
1594  final AbstractGUIElement element;
1595  switch (type) {
1596  case "floor": {
1597  final int index = ExpressionParser.parseInt(args.get());
1598  if (defaultItemPainter == null) {
1599  throw new IOException("cannot use 'item floor' without 'def item' command");
1600  }
1601 
1602  final ItemPainter itemPainter = defaultItemPainter.newItemPainter();
1603  element = new GUIItemFloor(tooltipManager, elementListener, commandQueue, name, itemPainter, index, server, floorView, model.getItemSet(), facesManager, nextGroupFace, prevGroupFace, 0, guiFactory);
1604  break;
1605  }
1606 
1607  case "inventory": {
1608  final int index = ExpressionParser.parseInt(args.get());
1609  if (defaultItemPainter == null) {
1610  throw new IOException("cannot use 'item inventory' without 'def item' command");
1611  }
1612 
1613  final ItemPainter itemPainter = defaultItemPainter.newItemPainter();
1614  element = new GUIItemInventory(tooltipManager, elementListener, commandQueue, name, itemPainter, index, server, facesManager, floorView, inventoryView, 0, guiFactory);
1615  break;
1616  }
1617 
1618  case "shortcut":
1619  final ShortcutSlot shortcutSlot = parseShortcutSlot(args.get());
1620  final Color activateColor = ParseUtils.parseColorNull(args.get());
1621  final Image activateImage = imageParser.getImage(activateColor, args.getPrev());
1622  final Color immediateColor = ParseUtils.parseColorNull(args.get());
1623  final Image immediateImage = imageParser.getImage(immediateColor, args.getPrev());
1624  final Font font = definedFonts.lookup(args.get());
1625  element = new GUIItemShortcut(tooltipManager, elementListener, name, activateColor, activateImage, immediateColor, immediateImage, shortcutSlot, facesManager, commandExecutor, shortcuts, font, guiFactory);
1626  break;
1627 
1628  case "spelllist":
1629  final int index = ExpressionParser.parseInt(args.get());
1630  if (defaultItemPainter == null) {
1631  throw new IOException("cannot use 'item spelllist' without 'def item' command");
1632  }
1633 
1634  final ItemPainter itemPainter = defaultItemPainter.newItemPainter();
1635  element = new GUIItemSpell(tooltipManager, elementListener, commandQueue, name, itemPainter, index, facesManager, model.getSpellsManager(), spellView, 0, guiFactory);
1636  break;
1637 
1638  default:
1639  throw new IOException("undefined item type: "+type);
1640  }
1641  insertGuiElement(element);
1642  }
1643 
1651  private void parseKey(@NotNull final Args args, @Nullable final Gui gui, @NotNull final String line) throws IOException {
1652  final KeyBindings keyBindings = gui == null ? skin.getDefaultKeyBindings() : gui.getKeyBindings();
1653  try {
1654  keyBindings.parseKeyBinding(line.substring(4).trim(), true);
1655  } catch (final InvalidKeyBindingException ex) {
1656  throw new IOException("invalid key binding: "+ex.getMessage(), ex);
1657  }
1658 
1659  // consume all arguments to prevent syntax error
1660  while (args.hasMore()) {
1661  args.get();
1662  }
1663  }
1664 
1674  private void parseLabelHtml(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
1675  final String name = args.get();
1676  final Font font = definedFonts.lookup(args.get());
1677  final Color color = ParseUtils.parseColor(args.get());
1678  final String text = ParseUtils.parseText(args, lnr);
1679  insertGuiElement(new GUIHTMLLabel(tooltipManager, elementListener, name, null, font, color, null, text, guiFactory));
1680  }
1681 
1691  private void parseLabelMulti(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
1692  final String name = args.get();
1693  final Font font = definedFonts.lookup(args.get());
1694  final Color color = ParseUtils.parseColor(args.get());
1695  final String text = ParseUtils.parseText(args, lnr);
1696  insertGuiElement(new GUIMultiLineLabel(tooltipManager, elementListener, name, null, font, color, null, Alignment.LEFT, text, guiFactory));
1697  }
1698 
1708  private void parseLabelQuery(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server) throws IOException, JXCSkinException {
1709  final String name = args.get();
1710  final Font font = definedFonts.lookup(args.get());
1711  final Color color = ParseUtils.parseColor(args.get());
1712  insertGuiElement(new GUILabelQuery(tooltipManager, elementListener, name, server, font, color, null, guiFactory));
1713  }
1714 
1725  private void parseLabelMessage(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server, @NotNull final JXCWindowRenderer windowRenderer) throws IOException, JXCSkinException {
1726  final String name = args.get();
1727  final Font font = definedFonts.lookup(args.get());
1728  final Color color = ParseUtils.parseColor(args.get());
1729  insertGuiElement(new GUILabelMessage(tooltipManager, elementListener, name, server, windowRenderer, font, color, null, guiFactory));
1730  }
1731 
1741  private void parseLabelFailure(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server) throws IOException, JXCSkinException {
1742  final String name = args.get();
1743  final Font font = definedFonts.lookup(args.get());
1744  final Color color = ParseUtils.parseColor(args.get());
1745  insertGuiElement(new GUILabelFailure(tooltipManager, elementListener, name, server, font, color, null, guiFactory));
1746  }
1747 
1757  private void parseLabelText(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
1758  final String name = args.get();
1759  final Font font = definedFonts.lookup(args.get());
1760  final Color color = ParseUtils.parseColor(args.get());
1761  final String text = ParseUtils.parseText(args, lnr);
1762  insertGuiElement(new GUIOneLineLabel(tooltipManager, elementListener, name, null, font, color, color, null, Alignment.LEFT, text, guiFactory));
1763  }
1764 
1773  private void parseLabelStat(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
1774  final String name = args.get();
1775  final Font textFont = definedFonts.lookup(args.get());
1776  final Color textColor = ParseUtils.parseColor(args.get());
1777  final Color textHighlightColor = ParseUtils.parseColor(args.get());
1778  final int stat = ParseUtils.parseStat(args.get());
1779  final Alignment alignment = NumberParser.parseEnum(Alignment.class, args.get(), "text alignment");
1780  final Color backgroundColor = args.hasMore() ? ParseUtils.parseColor(args.get()) : null;
1781  insertGuiElement(new GUILabelStats(tooltipManager, elementListener, name, textFont, textColor, textHighlightColor, backgroundColor, stat, alignment, model.getStats(), guiFactory));
1782  }
1783 
1792  private void parseLabelStat2(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
1793  final String name = args.get();
1794  final Font font = definedFonts.lookup(args.get());
1795  final Color colorNormal = ParseUtils.parseColor(args.get());
1796  final Color colorUpgradable = ParseUtils.parseColor(args.get());
1797  final Color colorDepleted = ParseUtils.parseColor(args.get());
1798  final Color colorBoosted = ParseUtils.parseColor(args.get());
1799  final Color colorBoostedUpgradable = ParseUtils.parseColor(args.get());
1800  final int statCurrent = ParseUtils.parseStat(args.get());
1801  final int statBase = ParseUtils.parseStat(args.get());
1802  final int statRace = ParseUtils.parseStat(args.get());
1803  final int statApplied = ParseUtils.parseStat(args.get());
1804  final Alignment alignment = NumberParser.parseEnum(Alignment.class, args.get(), "text alignment");
1805  insertGuiElement(new GUILabelStats2(tooltipManager, elementListener, name, font, colorNormal, colorUpgradable, colorDepleted, colorBoosted, colorBoostedUpgradable, null, statCurrent, statBase, statRace, statApplied, alignment, model.getStats(), guiFactory));
1806  }
1807 
1817  private void parseLabelNewchar(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server) throws IOException, JXCSkinException {
1818  final String name = args.get();
1819  final NewcharStat stat = NumberParser.parseEnum(NewcharStat.class, args.get(), "label stat");
1820  final NewcharType type = NumberParser.parseEnum(NewcharType.class, args.get(), "label type");
1821  final Font font = definedFonts.lookup(args.get());
1822  final Font fontError = definedFonts.lookup(args.get());
1823  final Color color = ParseUtils.parseColor(args.get());
1824  final Color colorError = ParseUtils.parseColor(args.get());
1825  insertGuiElement(new GUINewcharLabel(tooltipManager, elementListener, name, server, font, fontError, stat, type, newCharModel, color, colorError, guiFactory));
1826  }
1827 
1836  private void parseLabelSoundsCredits(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
1837  final String name = args.get();
1838  final Font font = definedFonts.lookup(args.get());
1839  final Color color = ParseUtils.parseColor(args.get());
1840  insertGuiElement(new GUIMultiLineLabel(tooltipManager, elementListener, name, null, font, color, null, Alignment.LEFT, soundsCredits, guiFactory));
1841  }
1842 
1850  private void parseLinkSize(@NotNull final Args args, @NotNull final Container gui) throws IOException, JXCSkinException {
1851  final String type = args.get();
1852  final List<Component> elements = new ArrayList<>();
1853  while (args.hasMore()) {
1854  elements.add(definedGUIElements.lookup(args.get()));
1855  }
1856  if (elements.size() < 2) {
1857  throw new IOException("'link_size' needs at least two gui elements");
1858  }
1859  final Component[] array = elements.toArray(new Component[elements.size()]);
1860  final GroupLayout layout = (GroupLayout)gui.getLayout();
1861  switch (type) {
1862  case "horizontal":
1863  layout.linkSize(SwingConstants.HORIZONTAL, array);
1864  break;
1865 
1866  case "vertical":
1867  layout.linkSize(SwingConstants.VERTICAL, array);
1868  break;
1869 
1870  case "both":
1871  layout.linkSize(SwingConstants.HORIZONTAL, array);
1872  layout.linkSize(SwingConstants.VERTICAL, array);
1873  break;
1874 
1875  default:
1876  throw new IOException("undefined type '"+type+"'");
1877  }
1878  }
1879 
1888  private void parseLogLabel(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
1889  final String name = args.get();
1890  final Image backgroundImage = args.get().equals("null") ? null : imageParser.getImage(args.getPrev());
1891  final Font fontPrint = definedFonts.lookup(args.get());
1892  final Font fontFixed = definedFonts.lookup(args.get());
1893  final Font fontFixedBold = definedFonts.lookup(args.get());
1894  final Font fontArcane = definedFonts.lookup(args.get());
1895  final Color defaultColor = ParseUtils.parseColor(args.get());
1896  final Color selectionColor = ParseUtils.parseColor(args.get());
1897  final Fonts fonts = new Fonts(fontPrint, fontFixed, fontFixedBold, fontArcane);
1898  insertGuiElement(new GUILabelLog(tooltipManager, elementListener, name, backgroundImage, fonts, defaultColor, selectionColor, guiFactory));
1899  }
1900 
1910  private void parseLogMessage(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server) throws IOException, JXCSkinException {
1911  final String name = args.get();
1912  final Image backgroundImage = args.get().equals("null") ? null : imageParser.getImage(args.getPrev());
1913  final Font fontPrint = definedFonts.lookup(args.get());
1914  final Font fontFixed = definedFonts.lookup(args.get());
1915  final Font fontFixedBold = definedFonts.lookup(args.get());
1916  final Font fontArcane = definedFonts.lookup(args.get());
1917  final Color defaultColor = ParseUtils.parseColor(args.get());
1918  final Color selectionColor = ParseUtils.parseColor(args.get());
1919  final Fonts fonts = new Fonts(fontPrint, fontFixed, fontFixedBold, fontArcane);
1920  insertGuiElement(new GUIMessageLog(tooltipManager, elementListener, name, server, backgroundImage, fonts, defaultColor, selectionColor, guiFactory));
1921  }
1922 
1929  private void parseLogColor(@NotNull final Args args) throws IOException, JXCSkinException {
1930  final String name = args.get();
1931  final int index = ExpressionParser.parseInt(args.get());
1932  final Color color = ParseUtils.parseColor(args.get());
1933  final Object element = definedGUIElements.lookup(name);
1934  if (!(element instanceof GUIMessageLog)) {
1935  throw new IOException("element '"+name+"' is not of type 'log'");
1936  }
1937  if (index < 0 || index >= MessageBufferUpdater.NUM_COLORS) {
1938  throw new IOException("invalid color index "+index);
1939  }
1940  ((GUIMessageLog)element).setColor(index, color);
1941  }
1942 
1949  private void parseLogFilter(@NotNull final Args args) throws IOException, JXCSkinException {
1950  final String name = args.get();
1951  final String type = args.get();
1952  final boolean add = switch (type) {
1953  case "only" -> true;
1954  case "not" -> false;
1955  default -> throw new IOException("type '"+type+"' is invalid");
1956  };
1957  final MessageTypesBuilder builder = new MessageTypesBuilder(add);
1958  do {
1959  try {
1960  builder.addType(args.get());
1961  } catch (final UnknownMessageTypeException ex) {
1962  throw new IOException(ex);
1963  }
1964  } while (args.hasMore());
1965  final Object element = definedGUIElements.lookup(name);
1966  if (!(element instanceof GUIMessageLog)) {
1967  throw new IOException("element '"+name+"' is not of type 'log'");
1968  }
1969  ((GUIMessageLog)element).setTypes(builder.build());
1970  }
1971 
1980  private void parseMinimap(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
1981  final String name = args.get();
1982  final int w = ExpressionParser.parseInt(args.get());
1983  final int h = ExpressionParser.parseInt(args.get());
1984  final FacesProvider facesProvider = facesProviderFactory.getFacesProvider(4);
1985  if (facesProvider == null) {
1986  throw new IOException("cannot create faces with size 4");
1987  }
1988  insertGuiElement(new GUIMiniMap(avoidCopyArea, tooltipManager, elementListener, name, mapUpdaterState, facesProvider, darknessColors, w, h, guiFactory));
1989  }
1990 
2001  private void parseMap(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server, @NotNull final SmoothFaces smoothFaces) throws IOException, JXCSkinException {
2002  final String name = args.get();
2004  if (facesProvider == null) {
2005  throw new IOException("cannot create faces with size "+defaultTileSize);
2006  }
2007  insertGuiElement(new GUIMap(avoidCopyArea, tooltipManager, elementListener, name, mapUpdaterState, facesProvider, server, smoothFaces, darknessColors, guiFactory));
2008  }
2009 
2019  private void parseMapDirections(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final SmoothFaces smoothFaces) throws IOException, JXCSkinException {
2020  final String name = args.get();
2022  if (facesProvider == null) {
2023  throw new IOException("cannot create faces with size "+defaultTileSize);
2024  }
2025  insertGuiElement(new GUIMapDirections(tooltipManager, elementListener, name, facesProvider, pendingDirections, guiFactory));
2026  }
2027 
2037  private void parseMetaList(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final MetaserverModel metaserverModel) throws IOException, JXCSkinException {
2038  final String name = args.get();
2039  final int cellWidth = ExpressionParser.parseInt(args.get()); // XXX: should be derived from list's size
2040  final int cellHeight = (int)(ExpressionParser.parseInt(args.get())*fontScaleFactor+0.0F); // XXX: should be derived from list's size
2041  final Image image = args.get().equals("null") ? null : imageParser.getImage(args.getPrev());
2042  final Font font = definedFonts.lookup(args.get());
2043  final GUIText text = args.get().equals("null") ? null : guiElementParser.lookupTextElement(args.getPrev());
2044  final AbstractLabel label = args.get().equals("null") ? null : guiElementParser.lookupLabelElement(args.getPrev());
2045  final CommandList connectCommandList = skin.getCommandList(args.get());
2046  final String format = args.get();
2047  final String tooltip = args.get();
2048  insertGuiElement(new GUIMetaElementList(tooltipManager, elementListener, name, cellWidth, cellHeight, metaserverModel, image, font, format, tooltip, text, label, connectCommandList, guiFactory));
2049  }
2050 
2062  private void parsePicture(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr, @NotNull final Gui gui, final boolean scaled) throws IOException, JXCSkinException {
2063  final String name = args.get();
2064  final BufferedImage image = scaled ? scaleImage(imageParser.getImage(args.get())) : imageParser.getImage(args.get());
2065  final float alpha = NumberParser.parseFloat(args.get());
2066  if (alpha < 0 || alpha > 1.0F) {
2067  throw new IOException("invalid alpha value: "+alpha);
2068  }
2069  final String text = ParseUtils.parseText(args, lnr).replaceAll("\n", "<br>");
2070  final GUIPicture picture = new GUIPicture(tooltipManager, elementListener, name, image, alpha, image.getWidth(), image.getHeight(), guiFactory, text);
2071  insertGuiElement(picture);
2072  if (name.equals("dialog_help")) {
2073  gui.setHelp(picture);
2074  }
2075  }
2076 
2086  private void parsePictureStat(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
2087  final String name = args.get();
2088  final int stat = ParseUtils.parseStat(args.get());
2089  final BufferedImage imageInactive = args.get().equals("null") ? null : imageParser.getImage(args.getPrev());
2090  final BufferedImage imageActive = args.get().equals("null") ? null : imageParser.getImage(args.getPrev());
2091  if (imageInactive == null && imageActive == null) {
2092  throw new IOException("picture is never visible");
2093  }
2094  final String text = ParseUtils.parseText(args, lnr).replaceAll("\n", "<br>");
2095  final int preferredWidth;
2096  final int preferredHeight;
2097  if (imageInactive == null) {
2098  preferredWidth = imageActive.getWidth();
2099  preferredHeight = imageActive.getHeight();
2100  } else if (imageActive == null) {
2101  preferredWidth = imageInactive.getWidth();
2102  preferredHeight = imageInactive.getHeight();
2103  } else {
2104  preferredWidth = imageInactive.getWidth();
2105  preferredHeight = imageInactive.getHeight();
2106  if (preferredWidth != imageActive.getWidth() || preferredHeight != imageActive.getHeight()) {
2107  throw new IOException("pictures do not have the same size");
2108  }
2109  }
2110  insertGuiElement(new GUIPictureStat(tooltipManager, elementListener, name, stat, imageInactive, imageActive, preferredWidth, preferredHeight, model.getStats(), guiFactory, text));
2111  }
2112 
2123  private void parseQueryText(@NotNull final Args args, @NotNull final CrossfireServerConnection server, @NotNull final CommandCallback commandCallback, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
2124  final String name = args.get();
2125  final Image activeImage = imageParser.getImage(args.get());
2126  final Image inactiveImage = imageParser.getImage(args.get());
2127  final Font font = definedFonts.lookup(args.get());
2128  final Color inactiveColor = ParseUtils.parseColor(args.get());
2129  final Color activeColor = ParseUtils.parseColor(args.get());
2130  final int margin = ExpressionParser.parseInt(args.get());
2131  final boolean enableHistory = NumberParser.parseBoolean(args.get());
2132  final CommandHistory commandHistory = enableHistory ? commandHistoryFactory.getCommandHistory(name) : null;
2133  insertGuiElement(new GUIQueryText(server, commandHistory, commandCallback, tooltipManager, elementListener, name, newCharModel, activeImage, inactiveImage, font, inactiveColor, activeColor, margin, "", guiFactory));
2134  }
2135 
2143  private void parseSetForcedActive(@NotNull final Args args, @NotNull final Gui gui) throws IOException, JXCSkinException {
2144  final Object forcedActive = definedGUIElements.lookup(args.get());
2145  if (!(forcedActive instanceof ActivatableGUIElement)) {
2146  throw new IOException("argument to set_forced_active must be an activatable gui element");
2147  }
2148  gui.setForcedActive((ActivatableGUIElement)forcedActive);
2149  }
2150 
2157  private static void parseSetAutoSize(@NotNull final Gui gui, @NotNull final Args args) throws IOException {
2158  final Expression x = ExpressionParser.parseExpression(args.get());
2159  final Expression y = ExpressionParser.parseExpression(args.get());
2160  final Expression w = ExpressionParser.parseExpression(args.get());
2161  final Expression h = ExpressionParser.parseExpression(args.get());
2162  gui.setAutoSize(new Extent(x, y, w, h));
2163  }
2164 
2171  private void parseSetDefault(@NotNull final Args args) throws IOException, JXCSkinException {
2172  definedGUIElements.lookup(args.get()).setDefault(true);
2173  }
2174 
2181  private void parseSetInvisible(@NotNull final Args args) throws IOException, JXCSkinException {
2182  definedGUIElements.lookup(args.get()).setVisible(false);
2183  }
2184 
2191  private void parseHideInput(@NotNull final Args args) throws IOException, JXCSkinException {
2192  final GUIText element;
2193  try {
2194  element = (GUIText)definedGUIElements.lookup(args.get());
2195  } catch (final JXCSkinException ignored) {
2196  throw new JXCSkinException("can't use hide_input on a non text field "+args.getPrev());
2197  }
2198  element.setHideInput(true);
2199  }
2200 
2208  private void parseFocus(@NotNull final Args args, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
2209  if (!focusOrder.isEmpty()) {
2210  throw new IOException("focus must not be used more than once");
2211  }
2212 
2213  final String begin = args.get();
2214  if (!begin.equals("begin")) {
2215  throw new IOException("syntax error: expecting 'begin'");
2216  }
2217 
2218  final Collection<ActivatableGUIElement> tmp = new TreeSet<>(ELEMENT_COMPARATOR);
2219  while (true) {
2220  final String line = lnr.readLine();
2221  if (line == null) {
2222  throw new IOException("unterminated 'begin' block");
2223  }
2224 
2225  if (line.startsWith("#") || line.isEmpty()) {
2226  continue;
2227  }
2228 
2229  final String[] argsTmp;
2230  try {
2231  argsTmp = StringUtils.splitFields(line);
2232  } catch (final UnterminatedTokenException ex) {
2233  throw new JXCSkinException(ex.getMessage(), ex);
2234  }
2235  final Args args2 = new Args(argsTmp);
2236  final String cmd = args2.get();
2237  if (cmd.equals("end")) {
2238  if (args2.hasMore()) {
2239  throw new IOException("excess arguments");
2240  }
2241  break;
2242  }
2243 
2244  final AbstractGUIElement element;
2245  try {
2246  element = definedGUIElements.lookup(cmd);
2247  } catch (final JXCSkinException ignored) {
2248  throw new JXCSkinException("can't use hide_input on a non text field "+cmd);
2249  }
2250 
2251  if (args2.hasMore()) {
2252  throw new IOException("excess arguments");
2253  }
2254 
2255  if (!(element instanceof ActivatableGUIElement)) {
2256  throw new IOException("not an activatable element: "+element);
2257  }
2258  if (!tmp.add((ActivatableGUIElement)element)) {
2259  throw new IOException("duplicate element: "+element);
2260  }
2261  focusOrder.add((ActivatableGUIElement)element);
2262  }
2263  if (tmp.isEmpty()) {
2264  throw new IOException("focus block must not be empty");
2265  }
2266  }
2267 
2272  private static void parseSetModal(@NotNull final Gui gui) {
2273  gui.setModal(true);
2274  }
2275 
2280  private static void parseSetUserResizable(@NotNull final Gui gui) {
2281  gui.setUserResizable(true);
2282  }
2283 
2292  private void parseScrollbar(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
2293  final String name = args.get();
2294  final boolean proportionalSlider = NumberParser.parseBoolean(args.get());
2295  final Object element = definedGUIElements.lookup(args.get());
2296  final Color colorBackground = ParseUtils.parseColor(args.get());
2297  final Color colorForeground = ParseUtils.parseColor(args.get());
2298  if (!(element instanceof GUIScrollable2)) {
2299  throw new IOException("'"+element+"' is not a scrollable element");
2300  }
2301  insertGuiElement(new GUIScrollBar(tooltipManager, elementListener, name, proportionalSlider, (GUIScrollable2)element, colorBackground, colorForeground, guiFactory));
2302  }
2303 
2309  private void parseSkinName(@NotNull final Args args) throws IOException {
2310  final String newSkinName = args.get();
2311  final Resolution minResolution = parseResolution(args.get());
2312  final Resolution maxResolution = parseResolution(args.get());
2313  if (!newSkinName.matches("[-a-z_0-9]+")) {
2314  throw new IOException("invalid skin_name: "+newSkinName);
2315  }
2316  if (minResolution.getWidth() > maxResolution.getWidth() || minResolution.getHeight() > maxResolution.getHeight()) {
2317  throw new IOException("minimum resolution ("+minResolution+") must not exceed maximum resolution ("+maxResolution+")");
2318  }
2319 
2320  skin.setSkinName(newSkinName, minResolution, maxResolution);
2321  }
2322 
2332  private void parseText(@NotNull final Args args, @NotNull final CommandCallback commandCallback, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
2333  final String name = args.get();
2334  final Image activeImage = scaleImage(imageParser.getImage(args.get()));
2335  final Image inactiveImage = scaleImage(imageParser.getImage(args.get()));
2336  final Font font = definedFonts.lookup(args.get());
2337  final Color activeColor = ParseUtils.parseColor(args.get());
2338  final Color inactiveColor = ParseUtils.parseColor(args.get());
2339  final int margin = ExpressionParser.parseInt(args.get());
2340  final CommandList commandList = skin.getCommandList(args.get());
2341  final boolean enableHistory = NumberParser.parseBoolean(args.get());
2342  final CommandHistory commandHistory = enableHistory ? commandHistoryFactory.getCommandHistory(name) : null;
2343  insertGuiElement(new GUITextField(commandCallback, commandHistory, tooltipManager, elementListener, name, newCharModel, activeImage, inactiveImage, font, inactiveColor, activeColor, margin, "", commandList, guiFactory));
2344  }
2345 
2355  private void parseTextButton(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
2356  if (textButtonFactory == null) {
2357  throw new IOException("missing 'def textbutton' command");
2358  }
2359 
2360  final String name = args.get();
2361  final boolean autoRepeat = NumberParser.parseBoolean(args.get());
2362  final CommandList commandList = skin.getCommandList(args.get());
2363  final String text = ParseUtils.parseText(args, lnr);
2364  assert textButtonFactory != null;
2365  insertGuiElement(textButtonFactory.newTextButton(tooltipManager, elementListener, name, text, autoRepeat, commandList));
2366  }
2367 
2377  private void parseTextGauge(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr) throws IOException, JXCSkinException {
2378  if (dialogFactory == null) {
2379  throw new IOException("missing 'def dialog' command");
2380  }
2381 
2382  final String name = args.get();
2383  final Image positiveImage = scaleImage(imageParser.getImage(args.get()));
2384  final Image positiveLowImage = scaleImage(imageParser.getImage(args.get()));
2385  final Image negativeImage = args.get().equals("null") ? null : scaleImage(imageParser.getImage(args.getPrev()));
2386  final Image emptyImage = scaleImage(imageParser.getImage(args.get()));
2387  final GaugeUpdater gaugeUpdater = newGaugeUpdater(args.get());
2388  final Orientation orientation = ParseUtils.parseOrientation(args.get());
2389  final Color color = ParseUtils.parseColor(args.get());
2390  final Font font = definedFonts.lookup(args.get());
2391  final CommandList commandList = args.get().equals("null") ? null : skin.getCommandList(args.getPrev());
2392  final String tooltipFormat = ParseUtils.parseText(args, lnr);
2393  assert dialogFactory != null;
2394  final float alpha = dialogFactory.getFrameAlpha();
2395  final GUITextGauge element = new GUITextGauge(tooltipManager, elementListener, name, positiveImage, positiveLowImage, negativeImage, emptyImage, orientation, tooltipFormat.isEmpty() ? null : tooltipFormat, color, font, alpha, commandList, guiFactory, model.getStats());
2396  insertGuiElement(element);
2397  gaugeUpdater.setGauge(element);
2398  }
2399 
2408  private void parseTooltip(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener) throws IOException, JXCSkinException {
2409  final Font font = definedFonts.lookup(args.get());
2410  final GUIHTMLLabel tooltipLabel = new GUIHTMLLabel(tooltipManager, elementListener, "tooltip", null, font, Color.BLACK, Color.WHITE, "", guiFactory);
2411  tooltipLabel.setAutoResize(true);
2412  skin.setTooltipLabel(tooltipLabel);
2413  }
2414 
2424  private void parseVertical(@NotNull final Args args, @NotNull final Container gui, @NotNull final LineNumberReader lnr, final boolean isDialog) throws IOException, JXCSkinException {
2425  final GroupLayout layout = (GroupLayout)gui.getLayout();
2426  final String begin = args.get();
2427  if (!begin.equals("begin")) {
2428  throw new IOException("syntax error: expecting 'begin'");
2429  }
2430  final Collection<GUIElement> unreferencedElements = new TreeSet<>(ELEMENT_COMPARATOR);
2431  for (GUIElement element : definedGUIElements) {
2432  unreferencedElements.add(element);
2433  }
2434  if (!isDialog) {
2435  final Group content = parseBegin(args, layout, lnr, unreferencedElements, true);
2436  if (!unreferencedElements.isEmpty()) {
2437  throw new IOException("layout doesn't define elements "+unreferencedElements);
2438  }
2439  layout.setVerticalGroup(content);
2440  return;
2441  }
2442  final AbstractGUIElement background = getUnreferencedElement("dialog_background", unreferencedElements);
2443  if (background == null) {
2444  throw new AssertionError("element 'dialog_background' is missing");
2445  }
2446  final Group content = parseBegin(args, layout, lnr, unreferencedElements, true);
2447  final Component title = getUnreferencedElement("dialog_title", unreferencedElements);
2448  final Component close = getUnreferencedElement("dialog_close", unreferencedElements);
2449  final Component help = getUnreferencedElement("dialog_help", unreferencedElements);
2450  final Group group2 = layout.createSequentialGroup();
2451  group2.addGap(background.getDialogBorderTop());
2452  if (title == null) {
2453  if (help == null) {
2454  if (close == null) {
2455  // no title, no help, no close
2456  group2.addGroup(content);
2457  } else {
2458  // no title, no help, close
2459  final Group group3 = layout.createParallelGroup();
2460  group3.addComponent(close);
2461  group3.addGroup(content);
2462  group2.addGroup(group3);
2463  }
2464  } else {
2465  if (close == null) {
2466  // no title, help, no close
2467  final Group group3 = layout.createParallelGroup();
2468  group3.addComponent(help);
2469  group3.addGroup(content);
2470  group2.addGroup(group3);
2471  } else {
2472  // no title, help, close
2473  final Group group3 = layout.createParallelGroup();
2474  group3.addComponent(help);
2475  group3.addComponent(close);
2476  group3.addGroup(content);
2477  group2.addGroup(group3);
2478  }
2479  }
2480  } else {
2481  if (help == null) {
2482  //noinspection IfStatementWithIdenticalBranches
2483  if (close == null) {
2484  // title, no help, no close
2485  group2.addComponent(title);
2486  group2.addGroup(content);
2487  } else {
2488  // title, no help, close
2489  final Group group3 = layout.createParallelGroup();
2490  group3.addComponent(title);
2491  group3.addComponent(close);
2492  group2.addGroup(group3);
2493  group2.addGroup(content);
2494  }
2495  } else {
2496  //noinspection IfStatementWithIdenticalBranches
2497  if (close == null) {
2498  // title, help, no close
2499  final Group group3 = layout.createParallelGroup();
2500  group3.addComponent(title);
2501  group3.addComponent(help);
2502  group2.addGroup(group3);
2503  group2.addGroup(content);
2504  } else {
2505  // title, help, close
2506  final Group group3 = layout.createParallelGroup();
2507  group3.addComponent(title);
2508  group3.addComponent(help);
2509  group3.addComponent(close);
2510  group2.addGroup(group3);
2511  group2.addGroup(content);
2512  }
2513  }
2514  }
2515  group2.addGap(background.getDialogBorderBottom());
2516  if (!unreferencedElements.isEmpty()) {
2517  throw new IOException("layout doesn't define elements "+unreferencedElements);
2518  }
2519 
2520  final Group group1 = layout.createParallelGroup();
2521  group1.addGroup(group2);
2522  group1.addComponent(background);
2523 
2524  layout.setVerticalGroup(group1);
2525  }
2526 
2533  @NotNull
2534  private static Resolution parseResolution(@NotNull final String text) throws IOException {
2535  final Resolution resolution = Resolution.parse(text);
2536  if (resolution == null) {
2537  throw new IOException("invalid resolution: "+text);
2538  }
2539  return resolution;
2540  }
2541 
2551  private void parseCharacterList(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CharacterModel characterModel) throws IOException, JXCSkinException {
2552  final String name = args.get();
2553  final int cellWidth = ExpressionParser.parseInt(args.get());
2554  final int cellHeight = ExpressionParser.parseInt(args.get());
2555  final Font font = definedFonts.lookup(args.get());
2556  insertGuiElement(new GUICharacterList(tooltipManager, facesManager, elementListener, name, cellWidth, cellHeight, font, characterModel, guiFactory));
2557  }
2558 
2564  private void insertGuiElement(@NotNull final AbstractGUIElement guiElement) throws JXCSkinException {
2565  definedGUIElements.insert(guiElement.getName(), guiElement);
2566  skin.insertGuiElement(guiElement);
2567  }
2568 
2585  private void addCommand(@NotNull final String listName, @NotNull final Args args, @Nullable final AbstractGUIElement element, @NotNull final String command, @NotNull final GuiStateManager guiStateManager, @NotNull final CommandExecutor commandExecutor, @NotNull final LineNumberReader lnr, @NotNull final CommandQueue commandQueue, @NotNull final CrossfireServerConnection crossfireServerConnection, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros) throws IOException, JXCSkinException {
2586  final CommandList commandList = skin.getCommandList(listName);
2587  commandList.add(commandParser.parseCommandArgs(args, element, command, guiStateManager, commandExecutor, lnr, commandQueue, crossfireServerConnection, commandCallback, macros));
2588  }
2589 
2597  @NotNull
2598  private GaugeUpdater newGaugeUpdater(@NotNull final String name) throws IOException {
2600  }
2601 
2614  @NotNull
2615  private Group parseBegin(@NotNull final Args beginArgs, @NotNull final GroupLayout layout, @NotNull final LineNumberReader lnr, @NotNull final Collection<GUIElement> unreferencedElements, final boolean topLevel) throws IOException, JXCSkinException {
2616  final String type = beginArgs.get();
2617  final Group group = switch (type) {
2618  case "seq" -> layout.createSequentialGroup();
2619  case "par" -> layout.createParallelGroup();
2620  default -> throw new IOException("undefined type '"+type+"'");
2621  };
2622 
2623  int elements = 0;
2624  while (true) {
2625  final String line = lnr.readLine();
2626  if (line == null) {
2627  throw new IOException("unterminated 'begin' block");
2628  }
2629 
2630  if (line.startsWith("#") || line.isEmpty()) {
2631  continue;
2632  }
2633 
2634  final String[] argsTmp;
2635  try {
2636  argsTmp = StringUtils.splitFields(line);
2637  } catch (final UnterminatedTokenException ex) {
2638  throw new JXCSkinException(ex.getMessage(), ex);
2639  }
2640  final Args args = new Args(argsTmp);
2641  final String cmd = args.get();
2642  if (cmd.equals("end")) {
2643  if (args.hasMore()) {
2644  throw new IOException("excess arguments");
2645  }
2646  break;
2647  }
2648  elements++;
2649  switch (cmd) {
2650  case "begin":
2651  group.addGroup(parseBegin(args, layout, lnr, unreferencedElements, false));
2652  break;
2653 
2654  case "border_gap":
2655  if (!(group instanceof SequentialGroup)) {
2656  throw new IOException("'border_gap' cannot be used outside 'seq' groups");
2657  }
2658  ((SequentialGroup)group).addContainerGap();
2659  break;
2660 
2661  case "gap":
2662  if (args.hasMore()) {
2663  final int tmp = ExpressionParser.parseInt(args.get());
2664  if (args.hasMore()) {
2665  final int size = ExpressionParser.parseInt(args.get());
2666  final int max = args.hasMore() ? ExpressionParser.parseInt(args.get()) : Short.MAX_VALUE;
2667  group.addGap(tmp, size, max);
2668  } else {
2669  group.addGap(tmp);
2670  }
2671  } else {
2672  group.addGap(0, 1, Short.MAX_VALUE);
2673  }
2674  break;
2675 
2676  default:
2677  final AbstractGUIElement element = definedGUIElements.lookup(cmd);
2678  if (!unreferencedElements.remove(element)) {
2679  throw new IOException("layout defines element '"+element+"' more than once");
2680  }
2681  if (args.hasMore()) {
2682  final int tmp = ExpressionParser.parseInt(args.get());
2683  final int min;
2684  final int pref;
2685  final int max;
2686  if (args.hasMore()) {
2687  min = tmp;
2688  pref = ExpressionParser.parseInt(args.get());
2689  max = args.hasMore() ? ExpressionParser.parseInt(args.get()) : Short.MAX_VALUE;
2690  } else {
2691  min = tmp;
2692  pref = tmp;
2693  max = tmp;
2694  }
2695  group.addComponent(element, min, pref, max);
2696  } else {
2697  group.addComponent(element);
2698  }
2699  break;
2700  }
2701  if (args.hasMore()) {
2702  throw new IOException("excess arguments");
2703  }
2704  }
2705  if (topLevel) {
2706  if (elements < 1) {
2707  throw new IOException("begin...end block must have at least one element");
2708  }
2709  } else {
2710  if (elements < 2) {
2711  throw new IOException("begin...end block must have at least two elements");
2712  }
2713  }
2714  return group;
2715  }
2716 
2722  @NotNull
2723  private BufferedImage scaleImage(@NotNull final BufferedImage sourceImage) {
2724  final int height = (int)(sourceImage.getHeight()*fontScaleFactor+0.5F);
2725  final Image scaled = sourceImage.getScaledInstance(-1, height, Image.SCALE_SMOOTH);
2726  final BufferedImage bufferedScaled = new BufferedImage(scaled.getWidth(null), scaled.getHeight(null), BufferedImage.TYPE_INT_ARGB);
2727  bufferedScaled.getGraphics().drawImage(scaled, 0, 0, null);
2728  return bufferedScaled;
2729  }
2730 
2737  @NotNull
2738  private static ShortcutSlot parseShortcutSlot(final String s) throws JXCSkinException {
2739  try {
2740  return ShortcutSlot.valueOf(s);
2741  } catch (final IllegalArgumentException ex) {
2742  throw new JXCSkinException("invalid shortcut slot '"+s+"'", ex);
2743  }
2744  }
2745 
2746 }
com.realtime.crossfire.jxclient.gui.textinput.GUIText
Abstract base class for text input fields.
Definition: GUIText.java:61
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.ListType.GROUND
GROUND
Create a GUIFloorList instance.
Definition: JXCSkinLoader.java:199
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.NUM_COLORS
static final int NUM_COLORS
The number of supported colors.
Definition: MessageBufferUpdater.java:43
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.optionManager
final OptionManager optionManager
The OptionManager instance to use.
Definition: JXCSkinLoader.java:345
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.skin.skin
Definition: DefaultJXCSkin.java:23
com.realtime.crossfire.jxclient.faces.FacesManager
Maintains a mapping of face numbers to face data.
Definition: FacesManager.java:40
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.getDialog
Gui getDialog(@NotNull final String name)
Returns a dialog by name.
Definition: DefaultJXCSkin.java:282
com.realtime.crossfire.jxclient.gui.label.Alignment.LEFT
LEFT
Left-aligned.
Definition: Alignment.java:34
com.realtime.crossfire.jxclient.gui.gauge.GUIGauge
Displays a value as a graphical gauge that's filling state depends on the value.
Definition: GUIGauge.java:47
com.realtime.crossfire.jxclient.gui.label.NewcharType
A stat type.
Definition: NewcharType.java:29
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.addOption
void addOption(@NotNull final String optionName, @NotNull final String documentation, @NotNull final Option commandCheckBoxOption)
Add a new option.
Definition: DefaultJXCSkin.java:389
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parsePicture
void parsePicture(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr, @NotNull final Gui gui, final boolean scaled)
Parses a "picture" command.
Definition: JXCSkinLoader.java:2062
com.realtime.crossfire.jxclient.gui.item.ItemPainter
Paints Crossfire item images.
Definition: ItemPainter.java:41
com.realtime.crossfire.jxclient.gui.gui.Gui
Combines a list of GUIElements to for a gui.
Definition: Gui.java:49
com.realtime.crossfire.jxclient.skin.events.SkillRemovedSkinEvent
A SkinEvent that executes a CommandList whenever a new skill has been lost.
Definition: SkillRemovedSkinEvent.java:35
com.realtime.crossfire.jxclient.skin.factory.TextButtonFactory
A factory class to create "textbutton" instances.
Definition: TextButtonFactory.java:42
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseGauge
void parseGauge(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr)
Parses a "gauge" command.
Definition: JXCSkinLoader.java:1339
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseDialogHide
static void parseDialogHide(@NotNull final Args args, @NotNull final Gui gui)
Parses a "dialog_hide" command.
Definition: JXCSkinLoader.java:1199
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLabelStat
void parseLabelStat(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "label_stat" command.
Definition: JXCSkinLoader.java:1773
com.realtime.crossfire.jxclient.server
com.realtime.crossfire.jxclient.gui.item.GUIItemFloor
A GUIElement representing an in-game object in the ground view.
Definition: GUIItemFloor.java:45
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.definedFonts
final JXCSkinCache< Font > definedFonts
All defined fonts.
Definition: JXCSkinLoader.java:362
com.realtime.crossfire.jxclient.skin.events.MapScrollSkinEvent
A SkinEvent that executes a CommandList whenever the map scroll protocol command is received.
Definition: MapScrollSkinEvent.java:35
com.realtime.crossfire.jxclient.skin.factory.TextButtonFactory.newTextButton
AbstractGUIElement newTextButton(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, @NotNull final String text, final boolean autoRepeat, @NotNull final CommandList commandList)
Creates a new text button.
Definition: TextButtonFactory.java:134
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.fontScaleFactor
final float fontScaleFactor
The scale factor for font sizes.
Definition: JXCSkinLoader.java:350
com.realtime.crossfire.jxclient.gui.textinput.GUIQueryText
Input field for "query" dialogs.
Definition: GUIQueryText.java:42
com.realtime.crossfire.jxclient.protocol.MessageTypesBuilder
Builds for MessageTypes instances.
Definition: MessageTypesBuilder.java:10
com.realtime.crossfire.jxclient.skin.io.FontParser.getFont
Font getFont(@NotNull final String name)
Returns a font by font file base name.
Definition: FontParser.java:59
com.realtime.crossfire.jxclient.shortcuts.ShortcutSlot
A slot in the shortcuts bar.
Definition: ShortcutSlot.java:8
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLabelMessage
void parseLabelMessage(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server, @NotNull final JXCWindowRenderer windowRenderer)
Parses a "label_message" command.
Definition: JXCSkinLoader.java:1725
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.load
void load(@NotNull final JXCSkinSource skinSource, @NotNull final String dialogName, @NotNull final String resourceName, @NotNull final InputStream inputStream, @NotNull final CrossfireServerConnection server, @NotNull final GuiStateManager guiStateManager, @NotNull final TooltipManager tooltipManager, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final GUIElementListener elementListener, @NotNull final MetaserverModel metaserverModel, @NotNull final CharacterModel characterModel, @NotNull final CommandQueue commandQueue, @Nullable final Gui gui, @NotNull final Shortcuts shortcuts, @NotNull final CommandExecutor commandExecutor, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros, @NotNull final Image nextGroupFace, @NotNull final Image prevGroupFace, @NotNull final SmoothFaces smoothFaces)
Loads a skin file and add the entries to a Gui instance.
Definition: JXCSkinLoader.java:671
com.realtime.crossfire.jxclient.map
Implements the map model which is shown in the map and magic map views.
Definition: CfMap.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.commandParser
CommandParser commandParser
The CommandParser for parsing commands.
Definition: JXCSkinLoader.java:393
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.soundsCredits
final String soundsCredits
The credits for the sound files.
Definition: JXCSkinLoader.java:297
com.realtime.crossfire.jxclient.window
Definition: DialogStateParser.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.dialogFactory
DialogFactory dialogFactory
The dialog factory.
Definition: JXCSkinLoader.java:374
com.realtime.crossfire.jxclient.server.crossfire.Model.getQuestsManager
QuestsManager getQuestsManager()
Definition: Model.java:127
com.realtime.crossfire.jxclient.skin.io.ParseUtils.parseText
static String parseText(@NotNull final Args args, @NotNull final LineNumberReader lnr)
Concatenates trailing arguments into a string.
Definition: ParseUtils.java:180
com.realtime.crossfire.jxclient.skin.io.GuiElementParser.lookupLabelLogElement
GUILabelLog lookupLabelLogElement(@NotNull final String name)
Returns a AbstractLabel by element name.
Definition: GuiElementParser.java:93
com.realtime.crossfire.jxclient.skin.io.ExpressionParser.parseExpression
static Expression parseExpression(@NotNull final String str)
Parses an integer constant.
Definition: ExpressionParser.java:80
com.realtime.crossfire.jxclient.skin
com.realtime.crossfire.jxclient.skin.io.ParseUtils.parseOrientation
static Orientation parseOrientation(@NotNull final String name)
Parses an orientation value.
Definition: ParseUtils.java:73
com.realtime.crossfire.jxclient.gui.misc.GUIScrollBar
A scroll bar gui element.
Definition: GUIScrollBar.java:43
com.realtime.crossfire.jxclient.util.ResourceUtils.loadImage
static ImageIcon loadImage(@NotNull final String name)
Loads an image file.
Definition: ResourceUtils.java:79
com.realtime.crossfire.jxclient.server.crossfire.Model.getSkillSet
SkillSet getSkillSet()
Definition: Model.java:102
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseSkinName
void parseSkinName(@NotNull final Args args)
Parses a "skin_name" command.
Definition: JXCSkinLoader.java:2309
com.realtime.crossfire.jxclient.gui.gauge.GaugeUpdater
Updates the displayed values in a GUIGauge.
Definition: GaugeUpdater.java:33
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseText
void parseText(@NotNull final Args args, @NotNull final CommandCallback commandCallback, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "text" command.
Definition: JXCSkinLoader.java:2332
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection
Adds encoding/decoding of crossfire protocol packets to a ServerConnection.
Definition: CrossfireServerConnection.java:37
com.realtime.crossfire.jxclient.gui.item.GUIItemInventory
A GUIItem for displaying inventory objects.
Definition: GUIItemInventory.java:46
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater
Adds drawinfo, drawextinfo, and query messages to a Buffer instance.
Definition: MessageBufferUpdater.java:38
com.realtime.crossfire.jxclient.skin.io.ImageParser
Creates BufferedImage instances from string representations.
Definition: ImageParser.java:42
com.realtime.crossfire.jxclient.skin.source
Definition: AbstractJXCSkinSource.java:23
com.realtime.crossfire.jxclient.skin.io.Args
Iterates over a list of.
Definition: Args.java:32
com.realtime.crossfire.jxclient.metaserver
Definition: DefaultMetaserver.java:23
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.setAutoResize
void setAutoResize(final boolean autoResize)
Enable or disable auto-resizing.
Definition: GUIHTMLLabel.java:102
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.guiManager
final GuiManager guiManager
The GuiManager to use.
Definition: JXCSkinLoader.java:320
com.realtime.crossfire.jxclient.skin.io.ExpressionParser.parseInt
static int parseInt(@NotNull final String str)
Parses an integer constant.
Definition: ExpressionParser.java:68
com.realtime.crossfire.jxclient.gui.commandlist.CommandListType
The command list type.
Definition: CommandListType.java:29
com.realtime.crossfire.jxclient.window.GuiManager
Maintains the application's main GUI state.
Definition: GuiManager.java:63
com.realtime.crossfire.jxclient.gui.map
Definition: AbstractGUIMap.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLabelNewchar
void parseLabelNewchar(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server)
Parses a "label_newchar" command.
Definition: JXCSkinLoader.java:1817
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseMinimap
void parseMinimap(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "minimap" command.
Definition: JXCSkinLoader.java:1980
com.realtime.crossfire.jxclient.gui.label
Definition: AbstractLabel.java:23
com.realtime.crossfire.jxclient.faces.FaceImagesUtils
Utility class for creating FaceImages instances.
Definition: FaceImagesUtils.java:36
com.realtime.crossfire.jxclient.skin.factory.DialogFactory
A factory class to create "textbutton" instances.
Definition: DialogFactory.java:44
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement
Abstract base class for GUI elements to be shown in Guis.
Definition: AbstractGUIElement.java:37
com.realtime.crossfire.jxclient.gui.label.AbstractLabel
Abstract base class for all label classes.
Definition: AbstractLabel.java:43
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseScrollbar
void parseScrollbar(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "scrollbar" command.
Definition: JXCSkinLoader.java:2292
com.realtime.crossfire.jxclient.items.SpellsView
Provides a view of all spells a character knows.
Definition: SpellsView.java:37
com.realtime.crossfire.jxclient.gui.label.GUILabelQuery
A GUIHTMLLabel that displays the last received "query" command.
Definition: GUILabelQuery.java:39
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.pendingDirections
final PendingDirections pendingDirections
The PendingDirections instance to show.
Definition: JXCSkinLoader.java:291
com.realtime.crossfire.jxclient.gui.textinput
Definition: ActivateCommandInputCommand.java:23
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.getCommandList
CommandList getCommandList(@NotNull final String name)
Returns a named command list.
Definition: DefaultJXCSkin.java:294
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseIgnore
void parseIgnore(@NotNull final Args args)
Parses an "ignore" command.
Definition: JXCSkinLoader.java:1366
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseDef
void parseDef(@NotNull final Args args, @NotNull final LineNumberReader lnr)
Parses a "def" command.
Definition: JXCSkinLoader.java:1068
com.realtime.crossfire.jxclient.gui.commandlist
Definition: CommandList.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.questView
final QuestsView questView
The QuestsView to use.
Definition: JXCSkinLoader.java:267
com.realtime.crossfire.jxclient.gui.list.GUIQuestList
A GUIList to display quests.
Definition: GUIQuestList.java:43
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.knowledgeView
final KnowledgeView knowledgeView
Definition: JXCSkinLoader.java:273
com.realtime.crossfire.jxclient.skin.skin.JXCSkinCache.lookup
T lookup(@NotNull final String name)
Looks up an element by name.
Definition: JXCSkinCache.java:92
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLabelFailure
void parseLabelFailure(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server)
Parses a "label_failure" command.
Definition: JXCSkinLoader.java:1741
com.realtime.crossfire.jxclient.gui.map.DarknessColors
Utility class for converting darkness values into colors.
Definition: DarknessColors.java:34
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.ListType.SPELL
SPELL
Create a GUISpellList instance.
Definition: JXCSkinLoader.java:204
com.realtime.crossfire.jxclient.gui.gauge.Orientation
Interface for orientation images.
Definition: Orientation.java:29
com.realtime.crossfire.jxclient.gui.list.GUIInventoryList
A GUIItemList for inventory views.
Definition: GUIInventoryList.java:44
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseSelectableButton
void parseSelectableButton(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr)
Parses a "selectable_button" command.
Definition: JXCSkinLoader.java:928
com.realtime.crossfire.jxclient.skin.io.ParseUtils.parseCheckBoxOption
static CheckBoxOption parseCheckBoxOption(@NotNull final String name, @NotNull final OptionManager optionManager)
Parses a checkbox option name.
Definition: ParseUtils.java:222
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.textButtonFactory
TextButtonFactory textButtonFactory
The text button factory.
Definition: JXCSkinLoader.java:368
com.realtime.crossfire.jxclient.gui.gui.ActivatableGUIElement
A GUIElement that can be set to active or inactive.
Definition: ActivatableGUIElement.java:33
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseSetDefault
void parseSetDefault(@NotNull final Args args)
Parses a "set_default" command.
Definition: JXCSkinLoader.java:2171
com.realtime.crossfire.jxclient.skin.io.GaugeUpdaterParser
Creates GaugeUpdater instances from string representations.
Definition: GaugeUpdaterParser.java:42
com.realtime.crossfire.jxclient.skin.io.Args.hasMore
boolean hasMore()
Returns whether more arguments exist.
Definition: Args.java:81
com.realtime.crossfire.jxclient.faces
Manages image information ("faces") needed to display the map view, items, and spell icons.
Definition: AbstractFaceQueue.java:23
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.insertGuiElement
void insertGuiElement(@NotNull final GUIElement guiElement)
Adds a new GUIElement to this skin.
Definition: DefaultJXCSkin.java:342
com.realtime.crossfire.jxclient.skin.skin.JXCSkinCache.clear
void clear()
Forgets all cached elements.
Definition: JXCSkinCache.java:67
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLogColor
void parseLogColor(@NotNull final Args args)
Parses a "log_color" command.
Definition: JXCSkinLoader.java:1929
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseCommandList
void parseCommandList(@NotNull final Args args, @NotNull final GuiStateManager guiStateManager, @NotNull final LineNumberReader lnr, @NotNull final CommandExecutor commandExecutor, @NotNull final CommandQueue commandQueue, @NotNull final CrossfireServerConnection server, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros)
Parses a "commandlist" command.
Definition: JXCSkinLoader.java:1008
com.realtime.crossfire.jxclient.skin.skin.JXCSkinCache
Implements a cache for elements identified by name.
Definition: JXCSkinCache.java:40
com.realtime.crossfire.jxclient.gui.keybindings
Definition: InvalidKeyBindingException.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.load
void load(@NotNull final JXCSkinSource skinSource, @NotNull final String dialogName, @NotNull final CrossfireServerConnection server, @NotNull final GuiStateManager guiStateManager, @NotNull final TooltipManager tooltipManager, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final GUIElementListener elementListener, @NotNull final MetaserverModel metaserverModel, @NotNull final CharacterModel characterModel, @NotNull final CommandQueue commandQueue, @Nullable final Gui gui, @NotNull final Shortcuts shortcuts, @NotNull final CommandExecutor commandExecutor, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros, @NotNull final Image nextGroupFace, @NotNull final Image prevGroupFace, @NotNull final SmoothFaces smoothFaces)
Loads a skin file and add the entries to a Gui instance.
Definition: JXCSkinLoader.java:619
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.setTooltipLabel
void setTooltipLabel(@Nullable final AbstractLabel tooltipLabel)
Sets the AbstractLabel that is used to display tooltips.
Definition: DefaultJXCSkin.java:402
com.realtime.crossfire.jxclient.gui.textinput.GUIText.setHideInput
void setHideInput(final boolean hideInput)
Enables or disables hidden text.
Definition: GUIText.java:518
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.keybindingsManager
final KeybindingsManager keybindingsManager
The KeybindingsManager containing key bindings.
Definition: JXCSkinLoader.java:454
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.avoidCopyArea
final boolean avoidCopyArea
Whether map scrolling is done by copying pixel areas.
Definition: JXCSkinLoader.java:279
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseComboBox
void parseComboBox(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "combobox" command.
Definition: JXCSkinLoader.java:967
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseTextGauge
void parseTextGauge(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr)
Parses a "textgauge" command.
Definition: JXCSkinLoader.java:2377
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.addCommand
void addCommand(@NotNull final String listName, @NotNull final Args args, @Nullable final AbstractGUIElement element, @NotNull final String command, @NotNull final GuiStateManager guiStateManager, @NotNull final CommandExecutor commandExecutor, @NotNull final LineNumberReader lnr, @NotNull final CommandQueue commandQueue, @NotNull final CrossfireServerConnection crossfireServerConnection, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros)
Parses and builds command arguments.
Definition: JXCSkinLoader.java:2585
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.knowledgeTypeView
final KnowledgeTypeView knowledgeTypeView
Definition: JXCSkinLoader.java:270
com.realtime.crossfire.jxclient.util.NumberParser
Utility class for parsing strings into numbers.
Definition: NumberParser.java:32
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.ListType.KNOWLEDGE_LIST
KNOWLEDGE_LIST
Create a GUIKnowledgeList instance.
Definition: JXCSkinLoader.java:224
com.realtime.crossfire.jxclient.skin.io.ParseUtils.parseColorNull
static Color parseColorNull(@NotNull final String name)
Parses a color name, optionally followed by "/<alpha>".
Definition: ParseUtils.java:104
com.realtime.crossfire.jxclient.gui.list.GUIKnowledgeTypeList
Definition: GUIKnowledgeTypeList.java:41
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseTextButton
void parseTextButton(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr)
Parses a "textbutton" command.
Definition: JXCSkinLoader.java:2355
com.realtime.crossfire.jxclient.skin.skin.JXCSkinException
Exception thrown if a skin related problem occurs.
Definition: JXCSkinException.java:31
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.JXCSkinLoader
JXCSkinLoader(@NotNull final Model model, @NotNull final InventoryView inventoryView, @NotNull final FloorView floorView, @NotNull final SpellsView spellView, @NotNull final SpellSkillView spellSkillsView, @NotNull final FacesManager facesManager, @NotNull final MapUpdaterState mapUpdaterState, @NotNull final KeyBindings defaultKeyBindings, @NotNull final OptionManager optionManager, final int defaultTileSize, @NotNull final KeybindingsManager keybindingsManager, @NotNull final QuestsView questView, @NotNull final CommandHistoryFactory commandHistoryFactory, @NotNull final KnowledgeView knowledgeView, @NotNull final KnowledgeTypeView knowledgeTypeView, final boolean avoidCopyArea, @NotNull final GuiManager guiManager, @NotNull final GuiFactory guiFactory, @NotNull final PendingDirections pendingDirections, @NotNull final String soundsCredits, final float fontScaleFactor)
Creates a new instance.
Definition: JXCSkinLoader.java:481
com.realtime.crossfire.jxclient.gui.gauge
Definition: AbstractOrientation.java:23
com.realtime.crossfire.jxclient.gui.log.GUIMessageLog
A gui element implementing the message window.
Definition: GUIMessageLog.java:40
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.ELEMENT_COMPARATOR
static final Comparator< GUIElement > ELEMENT_COMPARATOR
A Comparator that compares GUIElement instances by element name.
Definition: JXCSkinLoader.java:444
com.realtime.crossfire.jxclient.gui.gui.Expression
An expression yielding an integer value derived from a screen resolution.
Definition: Expression.java:31
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parsePictureStat
void parsePictureStat(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr)
Parses a "picture_stat" command.
Definition: JXCSkinLoader.java:2086
com.realtime.crossfire.jxclient.settings
Definition: CommandHistory.java:23
com.realtime.crossfire.jxclient.gui.list.GUICharacterList
A GUIList display characters of an account.
Definition: GUICharacterList.java:41
com.realtime.crossfire.jxclient.gui.gui.ActivatableGUIElement.setPrevActive
void setPrevActive(@NotNull final ActivatableGUIElement prev)
Sets the previous activatable GUI element in the same dialog.
Definition: ActivatableGUIElement.java:162
com.realtime.crossfire.jxclient.gui.log
Definition: Buffer.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLabelText
void parseLabelText(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr)
Parses a "label_text" command.
Definition: JXCSkinLoader.java:1757
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.facesProviderFactory
final FacesProviderFactory facesProviderFactory
The FacesProviderFactory instance for creating faces provider instances.
Definition: JXCSkinLoader.java:327
com.realtime.crossfire.jxclient.account.CharacterModel
Maintains the character list for an account.
Definition: CharacterModel.java:40
com.realtime.crossfire.jxclient.protocol
Definition: MagicMap.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseTooltip
void parseTooltip(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "tooltip" command.
Definition: JXCSkinLoader.java:2408
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.addDialog
void addDialog(@NotNull final String dialogName)
Defines a new dialog.
Definition: DefaultJXCSkin.java:350
com.realtime.crossfire.jxclient.gui.combobox.GUICharOptionsComboBox
A GUIComboBox that shows character creation options.
Definition: GUICharOptionsComboBox.java:47
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseCommandListAdd
void parseCommandListAdd(@NotNull final Args args, @NotNull final GuiStateManager guiStateManager, @NotNull final LineNumberReader lnr, @NotNull final CommandExecutor commandExecutor, @NotNull final CommandQueue commandQueue, @NotNull final CrossfireServerConnection server, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros)
Parses a "commandlist_add" command.
Definition: JXCSkinLoader.java:1031
com.realtime.crossfire.jxclient.skin.source.JXCSkinSource
Interface for providers of JXCSkin sources.
Definition: JXCSkinSource.java:34
com.realtime.crossfire.jxclient.gui.combobox.GUIStartingMapsComboBox
A GUIComboBox that shows available starting maps for character creation.
Definition: GUIStartingMapsComboBox.java:47
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseShortcutSlot
static ShortcutSlot parseShortcutSlot(final String s)
Parses a ShortcutSlot.
Definition: JXCSkinLoader.java:2738
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.defaultKeyBindings
final KeyBindings defaultKeyBindings
The default key bindings.
Definition: JXCSkinLoader.java:339
com.realtime.crossfire.jxclient.gui.list.GUIKnowledgeList
Definition: GUIKnowledgeList.java:42
com.realtime.crossfire.jxclient.gui.keybindings.KeyBindings
Manages a set of key bindings.
Definition: KeyBindings.java:47
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin
Default JXCSkin implementation.
Definition: DefaultJXCSkin.java:48
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel
Implements an AbstractLabel that displays HTML contents.
Definition: GUIHTMLLabel.java:49
com.realtime.crossfire.jxclient.guistate
Definition: ClientSocketState.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader
Parser for loading JXCSkin instances from JXCSkinSources.
Definition: JXCSkinLoader.java:182
com.realtime.crossfire.jxclient.gui.list
Definition: CharacterCellRenderer.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.newGaugeUpdater
GaugeUpdater newGaugeUpdater(@NotNull final String name)
Creates a new GaugeUpdater instance from a string representation.
Definition: JXCSkinLoader.java:2598
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLogFilter
void parseLogFilter(@NotNull final Args args)
Parses a "log_filter" command.
Definition: JXCSkinLoader.java:1949
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseMapDirections
void parseMapDirections(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final SmoothFaces smoothFaces)
Parses a "map_directions" command.
Definition: JXCSkinLoader.java:2019
com.realtime.crossfire.jxclient.gui.item.GUIItemSpell
A GUIItemItem that represents an entry in a GUISpellList.
Definition: GUIItemSpell.java:49
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.facesManager
final FacesManager facesManager
The FacesManager instance to use.
Definition: JXCSkinLoader.java:303
com.realtime.crossfire.jxclient.gui.textinput.GUICommandText
A GUIText element that executes the entered text as a command.
Definition: GUICommandText.java:44
com.realtime.crossfire.jxclient.skin.events
Definition: ConnectionStateSkinEvent.java:23
com.realtime.crossfire.jxclient.skin.factory.DialogFactory.getFrameAlpha
float getFrameAlpha()
Returns the alpha value for the frame background.
Definition: DialogFactory.java:233
com.realtime.crossfire.jxclient.server.crossfire.Model.getKnowledgeManager
KnowledgeManager getKnowledgeManager()
Definition: Model.java:132
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseSetModal
static void parseSetModal(@NotNull final Gui gui)
Parses a "set_modal" command.
Definition: JXCSkinLoader.java:2272
com.realtime.crossfire.jxclient.gui.list.GUISpellSkillList
A GUIItemList displaying spell skills.
Definition: GUISpellSkillList.java:43
com.realtime.crossfire.jxclient.skin.io.ExpressionParser
Parser for integer expressions.
Definition: ExpressionParser.java:35
com.realtime.crossfire.jxclient.gui.gui.GUIElement
Interface defining an abstract GUI element.
Definition: GUIElement.java:33
com.realtime.crossfire.jxclient.util.Resolution.getHeight
int getHeight()
Returns the height in pixels.
Definition: Resolution.java:96
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseButton
void parseButton(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr)
Parses a "button" command.
Definition: JXCSkinLoader.java:892
com.realtime.crossfire.jxclient.skin.io.CommandParser
Parser for creating GUICommand instances from string representations.
Definition: CommandParser.java:94
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.guiFactory
final GuiFactory guiFactory
The global GuiFactory instance.
Definition: JXCSkinLoader.java:285
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseMap
void parseMap(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server, @NotNull final SmoothFaces smoothFaces)
Parses a "map" command.
Definition: JXCSkinLoader.java:2001
com.realtime.crossfire.jxclient.gui.gauge.GUITextGauge
A GUIGauge which displays the current value as a text string on top of the gauge.
Definition: GUITextGauge.java:44
com.realtime.crossfire.jxclient.skin.factory
Definition: CheckBoxFactory.java:23
com.realtime.crossfire.jxclient.items.KnowledgeTypeView
Definition: KnowledgeTypeView.java:13
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLinkSize
void parseLinkSize(@NotNull final Args args, @NotNull final Container gui)
Parses a "link_size" command.
Definition: JXCSkinLoader.java:1850
com.realtime.crossfire.jxclient.skin.events.CrossfireMagicmapSkinEvent
A SkinEvent that executes a CommandList whenever a magicmap protocol command is received.
Definition: CrossfireMagicmapSkinEvent.java:35
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseBegin
Group parseBegin(@NotNull final Args beginArgs, @NotNull final GroupLayout layout, @NotNull final LineNumberReader lnr, @NotNull final Collection< GUIElement > unreferencedElements, final boolean topLevel)
Parses a "begin..end" block.
Definition: JXCSkinLoader.java:2615
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.ListType.INVENTORY
INVENTORY
Create a GUIInventoryList instance.
Definition: JXCSkinLoader.java:194
com.realtime.crossfire.jxclient.gui.gauge.GUIDupGauge
Displays a value as a graphical gauge that's filling state depends on the value.
Definition: GUIDupGauge.java:47
com.realtime.crossfire.jxclient.items.InventoryView
Provides a view of all items in the current player's inventory.
Definition: InventoryView.java:38
com.realtime.crossfire.jxclient.map.PendingDirections
Maintains pending movements of the character.
Definition: PendingDirections.java:40
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.ListType.KNOWLEDGE_TYPES
KNOWLEDGE_TYPES
Create a GUIKnowledgeTypeList instance.
Definition: JXCSkinLoader.java:219
com.realtime.crossfire.jxclient.settings.CommandHistoryFactory.getCommandHistory
CommandHistory getCommandHistory(@NotNull final String ident)
Returns a CommandHistory instance by name.
Definition: CommandHistoryFactory.java:49
com.realtime.crossfire.jxclient.settings.Macros
Manages macro expansion in command strings.
Definition: Macros.java:38
com.realtime.crossfire.jxclient.skills
Definition: Skill.java:23
com.realtime.crossfire.jxclient.skills.Skill
One skill of the character.
Definition: Skill.java:35
com.realtime.crossfire.jxclient.skin.io.Args.get
String get()
Returns the next argument.
Definition: Args.java:59
com.realtime.crossfire.jxclient.guistate.GuiStateManager
Maintains the current GuiState.
Definition: GuiStateManager.java:34
com.realtime.crossfire.jxclient.gui.gui.Extent
Encapsulates the extent of a GUI element.
Definition: Extent.java:32
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.defaultItemPainter
ItemPainter defaultItemPainter
The ItemPainter for default item parameters.
Definition: JXCSkinLoader.java:387
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.skin
DefaultJXCSkin skin
The JXCSkin being loaded.
Definition: JXCSkinLoader.java:430
com.realtime.crossfire.jxclient.gui.misc.GUIPictureStat
A AbstractGUIElement that displays a picture depending on the value of a stat.
Definition: GUIPictureStat.java:45
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseResolution
static Resolution parseResolution(@NotNull final String text)
Parses a resolution specification.
Definition: JXCSkinLoader.java:2534
com.realtime.crossfire.jxclient.settings.options.OptionManager
Maintains a set of named options.
Definition: OptionManager.java:36
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.ListType.QUEST
QUEST
Create a GUIQuestList instance.
Definition: JXCSkinLoader.java:209
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.insertGuiElement
void insertGuiElement(@NotNull final AbstractGUIElement guiElement)
Adds a new GUIElement to this skin.
Definition: JXCSkinLoader.java:2564
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseItem
void parseItem(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CommandQueue commandQueue, @NotNull final CommandExecutor commandExecutor, @NotNull final CrossfireServerConnection server, @NotNull final Shortcuts shortcuts, @NotNull final Image nextGroupFace, @NotNull final Image prevGroupFace)
Parses an "item" command.
Definition: JXCSkinLoader.java:1591
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.addCommandList
void addCommandList(@NotNull final String commandListName, @NotNull final CommandListType commandListType)
Defines a new command list.
Definition: DefaultJXCSkin.java:369
com.realtime.crossfire.jxclient.items.SpellSkillView
A list to display spell skills.
Definition: SpellSkillView.java:37
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.load
JXCSkin load(@NotNull final JXCSkinSource skinSource, @NotNull final CrossfireServerConnection crossfireServerConnection, @NotNull final GuiStateManager guiStateManager, @NotNull final TooltipManager tooltipManager, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final GUIElementListener elementListener, @NotNull final MetaserverModel metaserverModel, @NotNull final CharacterModel characterModel, @NotNull final CommandQueue commandQueue, @NotNull final Shortcuts shortcuts, @NotNull final CommandExecutor commandExecutor, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros, @NotNull final SmoothFaces smoothFaces)
Loads the skin from its external representation.
Definition: JXCSkinLoader.java:527
com.realtime.crossfire.jxclient.gui.keybindings.InvalidKeyBindingException
Indicates that a key binding is invalid.
Definition: InvalidKeyBindingException.java:31
com.realtime.crossfire.jxclient.skin.factory.CheckBoxFactory.newCheckBox
AbstractGUIElement newCheckBox(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, @NotNull final CheckBoxOption option, @NotNull final String text)
Creates a new checkbox.
Definition: CheckBoxFactory.java:98
com.realtime.crossfire.jxclient.skin.io.ParseUtils.parseStat
static int parseStat(@NotNull final String name)
Parses a stat value.
Definition: ParseUtils.java:56
com.realtime.crossfire.jxclient.skin.io.CommandParser.parseCommandArgs
GUICommand parseCommandArgs(@NotNull final Args args, @Nullable final AbstractGUIElement element, @NotNull final String command, @NotNull final GuiStateManager guiStateManager, @NotNull final CommandExecutor commandExecutor, @NotNull final LineNumberReader lnr, @NotNull final CommandQueue commandQueue, @NotNull final CrossfireServerConnection crossfireServerConnection, @NotNull final CommandCallback commandCallback, @NotNull final Macros macros)
Parses and builds command arguments.
Definition: CommandParser.java:171
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.ListType
The kind of list to create in ListType, TooltipManager, GUIElementListener, CommandQueue,...
Definition: JXCSkinLoader.java:189
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseSetAutoSize
static void parseSetAutoSize(@NotNull final Gui gui, @NotNull final Args args)
Parses a "set_auto_size" command.
Definition: JXCSkinLoader.java:2157
com.realtime.crossfire.jxclient.skin.io.ParseUtils
Utility class for parsing string parameters into values.
Definition: ParseUtils.java:42
com.realtime.crossfire.jxclient.faces.FaceImagesUtils.newFaceImages
static FaceImages newFaceImages(@NotNull final ImageIcon originalImageIcon)
Creates a new FaceImages instance from an "original" face; the "scaled" and "magic map" sized images ...
Definition: FaceImagesUtils.java:51
com.realtime.crossfire.jxclient.server.crossfire.Model.getItemSet
ItemSet getItemSet()
Definition: Model.java:147
com.realtime.crossfire.jxclient.gui.label.GUILabelStats2
A GUILabel that displays a value of the last received "stats" command.
Definition: GUILabelStats2.java:42
com.realtime.crossfire.jxclient.gui.misc.GUISpinner
A GUIElement that displays a spinner.
Definition: GUISpinner.java:53
com.realtime.crossfire.jxclient.gui
com.realtime.crossfire.jxclient.skin.io.FontParser
Creates Font instances from string representations.
Definition: FontParser.java:36
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.getDialogBorderTop
int getDialogBorderTop()
Returns the size of the dialog's top border.
Definition: AbstractGUIElement.java:288
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.commandHistoryFactory
final CommandHistoryFactory commandHistoryFactory
The CommandHistoryFactory to use.
Definition: JXCSkinLoader.java:314
com.realtime.crossfire.jxclient.gui.keybindings.KeyBindings.parseKeyBinding
void parseKeyBinding(@NotNull final String line, final boolean isDefault)
Parses and add a key binding.
Definition: KeyBindings.java:261
com.realtime.crossfire.jxclient.gui.gui.ActivatableGUIElement.setNextActive
void setNextActive(@NotNull final ActivatableGUIElement next)
Sets the next activatable GUI element in the same dialog.
Definition: ActivatableGUIElement.java:154
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.getDialogBorderBottom
int getDialogBorderBottom()
Returns the size of the dialog's bottom border.
Definition: AbstractGUIElement.java:312
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.ListType.SPELL_SKILLS
SPELL_SKILLS
Create a GUISpellSkillList instance.
Definition: JXCSkinLoader.java:214
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.getDialogBorderLeft
int getDialogBorderLeft()
Returns the size of the dialog's left border.
Definition: AbstractGUIElement.java:296
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.mapUpdaterState
final MapUpdaterState mapUpdaterState
The MapUpdaterState instance to use.
Definition: JXCSkinLoader.java:333
com.realtime.crossfire.jxclient.gui.misc.GUIFill
A GUIElement that fills an area with a given color.
Definition: GUIFill.java:41
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseEvent
void parseEvent(@NotNull final Args args, @NotNull final GuiStateManager guiStateManager, @NotNull final CrossfireServerConnection server)
Parses an "event" command.
Definition: JXCSkinLoader.java:1239
com.realtime.crossfire.jxclient.gui.textinput.GUITextField
A text input field which executes a CommandList when ENTER is pressed.
Definition: GUITextField.java:43
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer
Renders a Gui instance into a Frame.
Definition: JXCWindowRenderer.java:87
com.realtime.crossfire.jxclient.gui.label.NewCharModel
General information for creating new characters.
Definition: NewCharModel.java:43
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseSetUserResizable
static void parseSetUserResizable(@NotNull final Gui gui)
Parses a "set_modal" command.
Definition: JXCSkinLoader.java:2280
com.realtime.crossfire.jxclient.gui.combobox.GUIClassesComboBox
A GUIComboBox that shows available classes for character creation.
Definition: GUIClassesComboBox.java:46
com.realtime.crossfire.jxclient.skin.io.GaugeUpdaterParser.parseGaugeUpdater
GaugeUpdater parseGaugeUpdater(@NotNull final String name, @NotNull final ExperienceTable experienceTable)
Parses a gauge updater value.
Definition: GaugeUpdaterParser.java:82
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.getDialogBorderRight
int getDialogBorderRight()
Returns the size of the dialog's right border.
Definition: AbstractGUIElement.java:304
com.realtime.crossfire.jxclient.util.Resolution
Information about JXClient's screen/window resolution.
Definition: Resolution.java:36
com.realtime.crossfire.jxclient.gui.keybindings.KeybindingsManager
Manages key bindings.
Definition: KeybindingsManager.java:40
com.realtime.crossfire.jxclient.util.NumberParser.parseEnum
static< T extends Enum< T > T parseEnum(@NotNull final Class< T > class_, @NotNull final String name, @NotNull final String ident)
Parses an enum constant.
Definition: NumberParser.java:128
com.realtime.crossfire.jxclient.gui.textinput.CommandExecutor
Executes commands.
Definition: CommandExecutor.java:31
com.realtime.crossfire.jxclient.skin.skin.JXCSkinCache.insert
void insert(@NotNull final String name, @NotNull final T t)
Adds a new element to the cache.
Definition: JXCSkinCache.java:77
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLogMessage
void parseLogMessage(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server)
Parses a "log_message" command.
Definition: JXCSkinLoader.java:1910
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.guiElementParser
GuiElementParser guiElementParser
The GuiElementParser for parsing gui element specifications.
Definition: JXCSkinLoader.java:411
com.realtime.crossfire.jxclient.skin.io.GuiElementParser.lookupLabelElement
AbstractLabel lookupLabelElement(@NotNull final String name)
Returns a AbstractLabel by element name.
Definition: GuiElementParser.java:77
com.realtime.crossfire.jxclient.util.ResourceUtils.ALL_SPELL_SKILLS_ICON
static final String ALL_SPELL_SKILLS_ICON
The resource name for the default skill face.
Definition: ResourceUtils.java:64
com.realtime.crossfire.jxclient.metaserver.MetaserverModel
Maintains the metaserver information.
Definition: MetaserverModel.java:40
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseFocus
void parseFocus(@NotNull final Args args, @NotNull final LineNumberReader lnr)
Parses a "focus" block.
Definition: JXCSkinLoader.java:2208
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.spellView
final SpellsView spellView
The SpellsView to use.
Definition: JXCSkinLoader.java:255
com.realtime.crossfire.jxclient.util
Definition: Codec.java:23
com.realtime.crossfire.jxclient.gui.button
Definition: AbstractButton.java:23
com.realtime.crossfire.jxclient.skin.factory.CheckBoxFactory
A factory class to create "checkbox" instances.
Definition: CheckBoxFactory.java:40
com.realtime.crossfire.jxclient.gui.combobox
Definition: GUICharOptionsComboBox.java:23
com.realtime.crossfire.jxclient.server.crossfire
Definition: AbstractCrossfireServerConnection.java:23
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.addSkinEvent
void addSkinEvent(@NotNull final SkinEvent skinEvent)
Records a SkinEvent attached to this instance.
Definition: DefaultJXCSkin.java:416
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseCharacterList
void parseCharacterList(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CharacterModel characterModel)
Parses a "character_list" command.
Definition: JXCSkinLoader.java:2551
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLabelHtml
void parseLabelHtml(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr)
Parses a "label_html" command.
Definition: JXCSkinLoader.java:1674
com.realtime.crossfire.jxclient.util.StringUtils.splitFields
static String[] splitFields(@NotNull final String line)
Splits a line into tokens.
Definition: StringUtils.java:65
com.realtime.crossfire.jxclient.gui.map.GUIMap
Display the map view.
Definition: GUIMap.java:48
com.realtime.crossfire.jxclient.account
Definition: CharacterInformation.java:23
com.realtime.crossfire.jxclient.server.crossfire.Model.getExperienceTable
ExperienceTable getExperienceTable()
Definition: Model.java:112
com.realtime.crossfire.jxclient.server.crossfire.Model.getStats
Stats getStats()
Definition: Model.java:107
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseCommandText
void parseCommandText(@NotNull final Args args, @NotNull final CommandCallback commandCallback, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CommandExecutor commandExecutor, @NotNull final CrossfireServerConnection crossfireServerConnection)
Parses a "command_text" command.
Definition: JXCSkinLoader.java:1048
com.realtime.crossfire.jxclient.util.NumberParser.parseFloat
static float parseFloat(@NotNull final String str)
Parses a float constant.
Definition: NumberParser.java:95
com.realtime.crossfire.jxclient.faces.FaceImages
Consists of three ImageIcons representing a Face.
Definition: FaceImages.java:32
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.imageParser
ImageParser imageParser
The ImageParser for parsing image specifications.
Definition: JXCSkinLoader.java:399
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLabelQuery
void parseLabelQuery(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CrossfireServerConnection server)
Parses a "label_query" command.
Definition: JXCSkinLoader.java:1708
com.realtime.crossfire.jxclient.util.UnterminatedTokenException
Exception thrown for unterminated quoted tokens.
Definition: UnterminatedTokenException.java:31
com.realtime.crossfire.jxclient.shortcuts
Definition: Shortcut.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.newCharModel
final NewCharModel newCharModel
The NewCharModel instance to use.
Definition: JXCSkinLoader.java:237
com.realtime.crossfire.jxclient.skin.skin.GuiFactory
Factory for creating Gui instances.
Definition: GuiFactory.java:41
com.realtime.crossfire.jxclient.gui.button.GUISelectableButton
A GUIElement that implements a button.
Definition: GUISelectableButton.java:42
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.addInitEvent
void addInitEvent(@NotNull final CommandList commandList)
Adds a command list to be executed on "init" events.
Definition: DefaultJXCSkin.java:378
com.realtime.crossfire.jxclient.gui.commandlist.CommandList
A list of GUICommand instances.
Definition: CommandList.java:34
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.floorView
final FloorView floorView
The FloorView to use.
Definition: JXCSkinLoader.java:249
com.realtime.crossfire.jxclient.items.QuestsView
Provides a view of all quests a character is doing.
Definition: QuestsView.java:38
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLabelMulti
void parseLabelMulti(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr)
Parses a "label_multi" command.
Definition: JXCSkinLoader.java:1691
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.checkBoxFactory
CheckBoxFactory checkBoxFactory
The checkbox factory.
Definition: JXCSkinLoader.java:380
com.realtime.crossfire.jxclient.gui.scrollable.GUIScrollable2
A GUIScrollable that can be attached to GUIScrollBars.
Definition: GUIScrollable2.java:33
com.realtime.crossfire.jxclient.gui.gui
Definition: AbstractGUIElement.java:23
com.realtime.crossfire.jxclient.gui.button.ButtonImages
A set of images to form a button image.
Definition: ButtonImages.java:35
com.realtime.crossfire.jxclient.queue
Definition: CommandQueue.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseSetForcedActive
void parseSetForcedActive(@NotNull final Args args, @NotNull final Gui gui)
Parses a "set_forced_active" command.
Definition: JXCSkinLoader.java:2143
com.realtime.crossfire.jxclient.skin.io.ImageParser.getImage
Image getImage(@Nullable final Color color, @NotNull final String name)
Optionally loads an image by base file name.
Definition: ImageParser.java:79
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.spellSkillsView
final SpellSkillView spellSkillsView
The SpellSkillView to use.
Definition: JXCSkinLoader.java:261
com.realtime.crossfire.jxclient.gui.log.Fonts
Manage a set of fonts.
Definition: Fonts.java:32
com.realtime.crossfire.jxclient.faces.FacesProviderFactory
A factory for creating FacesProvider instances.
Definition: FacesProviderFactory.java:34
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLabelStat2
void parseLabelStat2(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "label_stat2" command.
Definition: JXCSkinLoader.java:1792
com.realtime.crossfire.jxclient.gui.label.GUINewcharLabel
A GUIHTMLLabel that displays stat information in the character creation dialog.
Definition: GUINewcharLabel.java:42
com.realtime.crossfire.jxclient.skin.skin.Dialogs
Maintains a set of Gui instances representing dialog windows.
Definition: Dialogs.java:39
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.defaultTileSize
final int defaultTileSize
The default tile size for the map view.
Definition: JXCSkinLoader.java:308
com.realtime.crossfire
com.realtime.crossfire.jxclient.protocol.MessageTypesBuilder.addType
void addType(@NotNull final String type)
Adds a type.
Definition: MessageTypesBuilder.java:38
com.realtime.crossfire.jxclient.protocol.UnknownMessageTypeException
An exception that is thrown if an undefined message type occurs.
Definition: UnknownMessageTypeException.java:31
com.realtime.crossfire.jxclient.gui.label.GUILabelFailure
A GUIHTMLLabel that displays the last received "failure" message.
Definition: GUILabelFailure.java:39
com.realtime.crossfire.jxclient.settings.options
Definition: CheckBoxOption.java:23
com.realtime.crossfire.jxclient.gui.textinput.CommandCallback
Interface that defines callback functions needed by commands.
Definition: CommandCallback.java:33
com.realtime.crossfire.jxclient.gui.gui.TooltipManager
Manages the tooltip display.
Definition: TooltipManager.java:33
com.realtime
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseDialog
void parseDialog(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr, @NotNull final Gui gui, @NotNull final String dialogName)
Parses a "dialog" command.
Definition: JXCSkinLoader.java:1172
com.realtime.crossfire.jxclient.util.NumberParser.parseBoolean
static boolean parseBoolean(@NotNull final String str)
Parses a boolean constant.
Definition: NumberParser.java:109
com.realtime.crossfire.jxclient.gui.scrollable
Definition: GUIScrollable.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.getUnreferencedElement
AbstractGUIElement getUnreferencedElement(@NotNull final String name, @NotNull final Collection< GUIElement > unreferencedElements)
Returns an unreferenced GUI element by name.
Definition: JXCSkinLoader.java:1568
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.inventoryView
final InventoryView inventoryView
The inventory InventoryView to use.
Definition: JXCSkinLoader.java:243
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.gaugeUpdaterParser
GaugeUpdaterParser gaugeUpdaterParser
The GaugeUpdaterParser for parsing gauge specifications.
Definition: JXCSkinLoader.java:356
com.realtime.crossfire.jxclient.skin.skin.JXCSkin
Defines a JXClient skin consisting of a main Gui and zero or more dialog Guis.
Definition: JXCSkin.java:42
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLabelSoundsCredits
void parseLabelSoundsCredits(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "label_sounds_credits" command.
Definition: JXCSkinLoader.java:1836
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseLogLabel
void parseLogLabel(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "log_label" command.
Definition: JXCSkinLoader.java:1888
com
com.realtime.crossfire.jxclient.skin.events.SkillAddedSkinEvent
A SkinEvent that executes a CommandList whenever a new skill has been gained.
Definition: SkillAddedSkinEvent.java:35
com.realtime.crossfire.jxclient.settings.CommandHistoryFactory
Factory for creating CommandHistory instances by name.
Definition: CommandHistoryFactory.java:33
com.realtime.crossfire.jxclient.gui.label.GUIMultiLineLabel
A AbstractLabel that renders the text as a list of plain strings.
Definition: GUIMultiLineLabel.java:46
com.realtime.crossfire.jxclient.gui.button.GUIButton
A GUIElement that implements a button.
Definition: GUIButton.java:43
com.realtime.crossfire.jxclient.skin.io.GuiElementParser
Creates gui element instances from string representations.
Definition: GuiElementParser.java:38
com.realtime.crossfire.jxclient.util.StringUtils
Utility class for string manipulation.
Definition: StringUtils.java:34
com.realtime.crossfire.jxclient.util.ResourceUtils.PREV_GROUP_FACE
static final String PREV_GROUP_FACE
The resource for "Click here for previous group of items" buttons.
Definition: ResourceUtils.java:52
com.realtime.crossfire.jxclient.settings.CommandHistory
Manages a list of previously entered commands.
Definition: CommandHistory.java:35
com.realtime.crossfire.jxclient.items
Definition: AbstractItemView.java:23
com.realtime.crossfire.jxclient.gui.label.Alignment
The text alignment.
Definition: Alignment.java:29
com.realtime.crossfire.jxclient.gui.commands.CommandCheckBoxOption
A CheckBoxOption that executes CommandLists when checked/unchecked.
Definition: CommandCheckBoxOption.java:34
com.realtime.crossfire.jxclient.gui.item
Definition: GUIItem.java:23
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.definedGUIElements
final JXCSkinCache< AbstractGUIElement > definedGUIElements
The defined GUIElements.
Definition: JXCSkinLoader.java:417
com.realtime.crossfire.jxclient.gui.misc.GUIPicture
A AbstractGUIElement that displays a picture.
Definition: GUIPicture.java:42
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseFont
void parseFont(@NotNull final Args args)
Parses a "font" command.
Definition: JXCSkinLoader.java:1323
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseQueryText
void parseQueryText(@NotNull final Args args, @NotNull final CrossfireServerConnection server, @NotNull final CommandCallback commandCallback, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "query_text" command.
Definition: JXCSkinLoader.java:2123
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.model
final Model model
The Model instance to use.
Definition: JXCSkinLoader.java:231
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.getDialogToLoad
String getDialogToLoad()
Returns one dialog pending loading.
Definition: DefaultJXCSkin.java:359
com.realtime.crossfire.jxclient.items.KnowledgeView
Displays knowledge items the player knows.
Definition: KnowledgeView.java:15
com.realtime.crossfire.jxclient.gui.misc.GUILabelMessage
A GUIHTMLLabel that displays the last received "drawinfo" message.
Definition: GUILabelMessage.java:44
com.realtime.crossfire.jxclient.gui.map.GUIMapDirections
Displays the pending movements on a map view.
Definition: GUIMapDirections.java:46
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseSetInvisible
void parseSetInvisible(@NotNull final Args args)
Parses a "set_invisible" command.
Definition: JXCSkinLoader.java:2181
com.realtime.crossfire.jxclient.skin.io.ImageParser.clear
void clear()
Forgets all defined images.
Definition: ImageParser.java:67
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.fontParser
FontParser fontParser
The FontParser for parsing font specifications.
Definition: JXCSkinLoader.java:405
com.realtime.crossfire.jxclient.shortcuts.Shortcuts
Manages a list of Shortcuts.
Definition: Shortcuts.java:43
com.realtime.crossfire.jxclient.skin.events.PlayerLoginSkinEvent
A SkinEvent that executes a CommandList at connection setup.
Definition: PlayerLoginSkinEvent.java:36
com.realtime.crossfire.jxclient.gui.gauge.GaugeUpdater.setGauge
void setGauge(@NotNull final GUIGaugeListener gauge)
Sets the gauge to update.
Definition: GaugeUpdater.java:71
com.realtime.crossfire.jxclient.items.FloorView
Provides a view to all items comprising the current floor view.
Definition: FloorView.java:36
com.realtime.crossfire.jxclient.map.MapUpdaterState
Update a CfMap model from protocol commands.
Definition: MapUpdaterState.java:49
com.realtime.crossfire.jxclient.gui.commandlist.CommandList.add
void add(@NotNull final GUICommand guiCommand)
Adds a command to the end of this command list.
Definition: CommandList.java:60
com.realtime.crossfire.jxclient.skills.SkillSet.getNamedSkill
Skill getNamedSkill(@NotNull final String skillName, final int face)
Returns the skill instance for a given skill name.
Definition: SkillSet.java:161
com.realtime.crossfire.jxclient.skin.events.ConnectionStateSkinEvent
A SkinEvent that executes a CommandList at connection setup.
Definition: ConnectionStateSkinEvent.java:35
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.darknessColors
final DarknessColors darknessColors
The DarknessColors instance for converting darkness values into colors.
Definition: JXCSkinLoader.java:437
com.realtime.crossfire.jxclient.faces.FacesProviderFactory.getFacesProvider
FacesProvider getFacesProvider(final int size)
Returns the FacesProvider for a given face size.
Definition: FacesProviderFactory.java:71
com.realtime.crossfire.jxclient.util.ResourceUtils.NEXT_GROUP_FACE
static final String NEXT_GROUP_FACE
The resource for "Click here for next group of items" buttons.
Definition: ResourceUtils.java:46
com.realtime.crossfire.jxclient.settings.options.CheckBoxOption
The base class for all check box options.
Definition: CheckBoxOption.java:32
com.realtime.crossfire.jxclient.gui.list.GUISpellList
A GUIList to display spells.
Definition: GUISpellList.java:45
com.realtime.crossfire.jxclient.faces.FacesProvider
Interface for face providers.
Definition: FacesProvider.java:34
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseKey
void parseKey(@NotNull final Args args, @Nullable final Gui gui, @NotNull final String line)
Parses a "key" command.
Definition: JXCSkinLoader.java:1651
com.realtime.crossfire.jxclient.gui.commands
Definition: AccountCreateCharacterCommand.java:23
com.realtime.crossfire.jxclient.gui.item.ItemPainter.newItemPainter
ItemPainter newItemPainter()
Creates a new instance having the same parameters as this instance except for the item's size.
Definition: ItemPainter.java:236
com.realtime.crossfire.jxclient.gui.misc
Definition: GUICheckBox.java:23
com.realtime.crossfire.jxclient.gui.label.GUIOneLineLabel
A AbstractLabel that renders the text as a plain string.
Definition: GUIOneLineLabel.java:43
com.realtime.crossfire.jxclient.util.ResourceUtils
Utility class for loading information from resources.
Definition: ResourceUtils.java:34
com.realtime.crossfire.jxclient.faces.SmoothFaces
Maintains smoothing information received from the Crossfire server.
Definition: SmoothFaces.java:33
com.realtime.crossfire.jxclient.skin.io.ParseUtils.parseColor
static Color parseColor(@NotNull final String name)
Parses a color name.
Definition: ParseUtils.java:90
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseFill
void parseFill(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "fill" command.
Definition: JXCSkinLoader.java:1307
com.realtime.crossfire.jxclient.server.crossfire.Model.getSpellsManager
SpellsManager getSpellsManager()
Definition: Model.java:122
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseSpinner
void parseSpinner(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener)
Parses a "spinner" command.
Definition: JXCSkinLoader.java:989
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseDupGauge
void parseDupGauge(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr)
Parses a "dupgauge" command.
Definition: JXCSkinLoader.java:1214
com.realtime.crossfire.jxclient.queue.CommandQueue
Maintains the pending (ncom) commands sent to the server.
Definition: CommandQueue.java:38
com.realtime.crossfire.jxclient.util.Resolution.parse
static Resolution parse(@NotNull final String str)
Creates a new instance from string representation.
Definition: Resolution.java:67
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseHorizontal
void parseHorizontal(@NotNull final Args args, @NotNull final Container gui, @NotNull final LineNumberReader lnr, final boolean isDialog)
Parses a "horizontal" command.
Definition: JXCSkinLoader.java:1443
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.setSkinName
void setSkinName(@NotNull final String skinName, @NotNull final Resolution minResolution, @NotNull final Resolution maxResolution)
Sets the skin name.
Definition: DefaultJXCSkin.java:153
com.realtime.crossfire.jxclient.gui.log.GUILabelLog
A gui element implementing a static text field which may contain media tags.
Definition: GUILabelLog.java:38
com.realtime.crossfire.jxclient.gui.label.NewcharStat
A stat value.
Definition: NewcharStat.java:32
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseHideInput
void parseHideInput(@NotNull final Args args)
Parses a "hide_input" command.
Definition: JXCSkinLoader.java:2191
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseVertical
void parseVertical(@NotNull final Args args, @NotNull final Container gui, @NotNull final LineNumberReader lnr, final boolean isDialog)
Parses a "vertical" command.
Definition: JXCSkinLoader.java:2424
com.realtime.crossfire.jxclient.skin.factory.DialogFactory.newDialog
Iterable< AbstractGUIElement > newDialog(@NotNull final TooltipManager tooltipManager, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final GUIElementListener elementListener, @NotNull final String title)
Creates a new dialog.
Definition: DialogFactory.java:218
com.realtime.crossfire.jxclient.util.Resolution.getWidth
int getWidth()
Returns the width in pixels.
Definition: Resolution.java:88
com.realtime.crossfire.jxclient.gui.map.GUIMiniMap
Displays a small map view.
Definition: GUIMiniMap.java:44
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseMetaList
void parseMetaList(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final MetaserverModel metaserverModel)
Parses a "meta_list" command.
Definition: JXCSkinLoader.java:2037
com.realtime.crossfire.jxclient.gui.item.GUIItemShortcut
Displays a shortcut command.
Definition: GUIItemShortcut.java:51
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseCheckbox
void parseCheckbox(@NotNull final Args args, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final LineNumberReader lnr)
Parses a "checkbox" command.
Definition: JXCSkinLoader.java:947
com.realtime.crossfire.jxclient.gui.list.GUIFloorList
A GUIItemList for floor views.
Definition: GUIFloorList.java:45
com.realtime.crossfire.jxclient.gui.label.GUILabelStats
A GUILabel that displays a value of the last received "stats" command.
Definition: GUILabelStats.java:43
com.realtime.crossfire.jxclient.gui.list.GUIMetaElementList
A GUIList that tracks a Metaserver instance.
Definition: GUIMetaElementList.java:45
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.focusOrder
final List< ActivatableGUIElement > focusOrder
The defined ActivatableGUIElement in focus order.
Definition: JXCSkinLoader.java:424
com.realtime.crossfire.jxclient.server.crossfire.Model
Combines all model classes that are updated.
Definition: Model.java:43
com.realtime.crossfire.jxclient.gui.gui.GUIElementListener
Listener for GUIElement related events.
Definition: GUIElementListener.java:32
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.parseList
void parseList(@NotNull final Args args, final ListType type, @NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CommandQueue commandQueue, @NotNull final CrossfireServerConnection server, @NotNull final Image nextGroupFace, @NotNull final Image prevGroupFace)
Parses an "inventory_list", "floor_list", "spells_list" or "quests_list" command.
Definition: JXCSkinLoader.java:1385
com.realtime.crossfire.jxclient.skin.io.GuiElementParser.lookupTextElement
GUIText lookupTextElement(@NotNull final String name)
Returns a GUIText by element name.
Definition: GuiElementParser.java:61
com.realtime.crossfire.jxclient.gui.combobox.GUIRacesComboBox
A GUIComboBox that shows available races for character creation.
Definition: GUIRacesComboBox.java:46
com.realtime.crossfire.jxclient.protocol.MessageTypesBuilder.build
MessageTypes build()
Creates a new MessageTypes instance.
Definition: MessageTypesBuilder.java:55
com.realtime.crossfire.jxclient.gui.gui.RendererGuiState
All gui states of JXCWindowRenderer.
Definition: RendererGuiState.java:31
com.realtime.crossfire.jxclient.skin.io.JXCSkinLoader.scaleImage
BufferedImage scaleImage(@NotNull final BufferedImage sourceImage)
Scales an image by a factor.
Definition: JXCSkinLoader.java:2723
com.realtime.crossfire.jxclient.skin.skin.DefaultJXCSkin.getDefaultKeyBindings
KeyBindings getDefaultKeyBindings()
Returns the default key bindings for this skin.
Definition: DefaultJXCSkin.java:306