1. /*
  2. * @(#)PixmapEngineParser.java 1.17 03/01/23
  3. *
  4. * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package com.sun.java.swing.plaf.gtk;
  8. import java.io.IOException;
  9. import java.util.ArrayList;
  10. import java.awt.Font;
  11. import java.awt.Insets;
  12. /**
  13. * A parser for the "pixmap" engine sections in GTK rc theme files.
  14. *
  15. * @author Shannon Hickey
  16. * @version 1.17 01/23/03
  17. */
  18. class PixmapEngineParser extends GTKEngineParser {
  19. private static final int SYM_IMAGE = GTKScanner.TOKEN_LAST + 1;
  20. private static final int SYM_FUNCTION = SYM_IMAGE + 1;
  21. private static final int SYM_FILE = SYM_FUNCTION + 1;
  22. private static final int SYM_STRETCH = SYM_FILE + 1;
  23. private static final int SYM_RECOLORABLE = SYM_STRETCH + 1;
  24. private static final int SYM_BORDER = SYM_RECOLORABLE + 1;
  25. private static final int SYM_DETAIL = SYM_BORDER + 1;
  26. private static final int SYM_STATE = SYM_DETAIL + 1;
  27. private static final int SYM_SHADOW = SYM_STATE + 1;
  28. private static final int SYM_GAP_SIDE = SYM_SHADOW + 1;
  29. private static final int SYM_GAP_FILE = SYM_GAP_SIDE + 1;
  30. private static final int SYM_GAP_BORDER = SYM_GAP_FILE + 1;
  31. private static final int SYM_GAP_START_FILE = SYM_GAP_BORDER + 1;
  32. private static final int SYM_GAP_START_BORDER = SYM_GAP_START_FILE + 1;
  33. private static final int SYM_GAP_END_FILE = SYM_GAP_START_BORDER + 1;
  34. private static final int SYM_GAP_END_BORDER = SYM_GAP_END_FILE + 1;
  35. private static final int SYM_OVERLAY_FILE = SYM_GAP_END_BORDER + 1;
  36. private static final int SYM_OVERLAY_BORDER = SYM_OVERLAY_FILE + 1;
  37. private static final int SYM_OVERLAY_STRETCH = SYM_OVERLAY_BORDER + 1;
  38. private static final int SYM_ARROW_DIRECTION = SYM_OVERLAY_STRETCH + 1;
  39. private static final int SYM_ORIENTATION = SYM_ARROW_DIRECTION + 1;
  40. private static final int SYM_D_HLINE = SYM_ORIENTATION + 1;
  41. private static final int SYM_D_VLINE = SYM_D_HLINE + 1;
  42. private static final int SYM_D_SHADOW = SYM_D_VLINE + 1;
  43. private static final int SYM_D_POLYGON = SYM_D_SHADOW + 1;
  44. private static final int SYM_D_ARROW = SYM_D_POLYGON + 1;
  45. private static final int SYM_D_DIAMOND = SYM_D_ARROW + 1;
  46. private static final int SYM_D_OVAL = SYM_D_DIAMOND + 1;
  47. private static final int SYM_D_STRING = SYM_D_OVAL + 1;
  48. private static final int SYM_D_BOX = SYM_D_STRING + 1;
  49. private static final int SYM_D_FLAT_BOX = SYM_D_BOX + 1;
  50. private static final int SYM_D_CHECK = SYM_D_FLAT_BOX + 1;
  51. private static final int SYM_D_OPTION = SYM_D_CHECK + 1;
  52. private static final int SYM_D_CROSS = SYM_D_OPTION + 1;
  53. private static final int SYM_D_RAMP = SYM_D_CROSS + 1;
  54. private static final int SYM_D_TAB = SYM_D_RAMP + 1;
  55. private static final int SYM_D_SHADOW_GAP = SYM_D_TAB + 1;
  56. private static final int SYM_D_BOX_GAP = SYM_D_SHADOW_GAP + 1;
  57. private static final int SYM_D_EXTENSION = SYM_D_BOX_GAP + 1;
  58. private static final int SYM_D_FOCUS = SYM_D_EXTENSION + 1;
  59. private static final int SYM_D_SLIDER = SYM_D_FOCUS + 1;
  60. private static final int SYM_D_ENTRY = SYM_D_SLIDER + 1;
  61. private static final int SYM_D_HANDLE = SYM_D_ENTRY + 1;
  62. private static final int SYM_D_STEPPER = SYM_D_HANDLE + 1;
  63. private static final int SYM_TRUE = SYM_D_STEPPER + 1;
  64. private static final int SYM_FALSE = SYM_TRUE + 1;
  65. private static final int SYM_TOP = SYM_FALSE + 1;
  66. private static final int SYM_UP = SYM_TOP + 1;
  67. private static final int SYM_BOTTOM = SYM_UP + 1;
  68. private static final int SYM_DOWN = SYM_BOTTOM + 1;
  69. private static final int SYM_LEFT = SYM_DOWN + 1;
  70. private static final int SYM_RIGHT = SYM_LEFT + 1;
  71. private static final int SYM_NORMAL = SYM_RIGHT + 1;
  72. private static final int SYM_ACTIVE = SYM_NORMAL + 1;
  73. private static final int SYM_PRELIGHT = SYM_ACTIVE + 1;
  74. private static final int SYM_SELECTED = SYM_PRELIGHT + 1;
  75. private static final int SYM_INSENSITIVE = SYM_SELECTED + 1;
  76. private static final int SYM_NONE = SYM_INSENSITIVE + 1;
  77. private static final int SYM_IN = SYM_NONE + 1;
  78. private static final int SYM_OUT = SYM_IN + 1;
  79. private static final int SYM_ETCHED_IN = SYM_OUT + 1;
  80. private static final int SYM_ETCHED_OUT = SYM_ETCHED_IN + 1;
  81. private static final int SYM_HORIZONTAL = SYM_ETCHED_OUT + 1;
  82. private static final int SYM_VERTICAL = SYM_HORIZONTAL + 1;
  83. private static final int[] symbolVals = {
  84. SYM_IMAGE, SYM_FUNCTION, SYM_FILE, SYM_STRETCH, SYM_RECOLORABLE,
  85. SYM_BORDER, SYM_DETAIL, SYM_STATE, SYM_SHADOW, SYM_GAP_SIDE,
  86. SYM_GAP_FILE, SYM_GAP_BORDER, SYM_GAP_START_FILE, SYM_GAP_START_BORDER,
  87. SYM_GAP_END_FILE, SYM_GAP_END_BORDER, SYM_OVERLAY_FILE, SYM_OVERLAY_BORDER,
  88. SYM_OVERLAY_STRETCH, SYM_ARROW_DIRECTION, SYM_ORIENTATION, SYM_D_HLINE,
  89. SYM_D_VLINE, SYM_D_SHADOW, SYM_D_POLYGON, SYM_D_ARROW, SYM_D_DIAMOND,
  90. SYM_D_OVAL, SYM_D_STRING, SYM_D_BOX, SYM_D_FLAT_BOX, SYM_D_CHECK,
  91. SYM_D_OPTION, SYM_D_CROSS, SYM_D_RAMP, SYM_D_TAB, SYM_D_SHADOW_GAP,
  92. SYM_D_BOX_GAP, SYM_D_EXTENSION, SYM_D_FOCUS, SYM_D_SLIDER, SYM_D_ENTRY,
  93. SYM_D_HANDLE, SYM_D_STEPPER, SYM_TRUE, SYM_FALSE, SYM_TOP, SYM_UP,
  94. SYM_BOTTOM, SYM_DOWN, SYM_LEFT, SYM_RIGHT, SYM_NORMAL, SYM_ACTIVE,
  95. SYM_PRELIGHT, SYM_SELECTED, SYM_INSENSITIVE, SYM_NONE, SYM_IN, SYM_OUT,
  96. SYM_ETCHED_IN, SYM_ETCHED_OUT, SYM_HORIZONTAL, SYM_VERTICAL
  97. };
  98. private static final String[] symbolNames = {
  99. "image", // SYM_IMAGE
  100. "function", // SYM_FUNCTION
  101. "file", // SYM_FILE
  102. "stretch", // SYM_STRETCH
  103. "recolorable", // SYM_RECOLORABLE
  104. "border", // SYM_BORDER
  105. "detail", // SYM_DETAIL
  106. "state", // SYM_STATE
  107. "shadow", // SYM_SHADOW
  108. "gap_side", // SYM_GAP_SIDE
  109. "gap_file", // SYM_GAP_FILE
  110. "gap_border", // SYM_GAP_BORDER
  111. "gap_start_file", // SYM_GAP_START_FILE
  112. "gap_start_border", // SYM_GAP_START_BORDER
  113. "gap_end_file", // SYM_GAP_END_FILE
  114. "gap_end_border", // SYM_GAP_END_BORDER
  115. "overlay_file", // SYM_OVERLAY_FILE
  116. "overlay_border", // SYM_OVERLAY_BORDER
  117. "overlay_stretch", // SYM_OVERLAY_STRETCH
  118. "arrow_direction", // SYM_ARROW_DIRECTION
  119. "orientation", // SYM_ORIENTATION
  120. "HLINE", // SYM_D_HLINE
  121. "VLINE", // SYM_D_VLINE
  122. "SHADOW", // SYM_D_SHADOW
  123. "POLYGON", // SYM_D_POLYGON
  124. "ARROW", // SYM_D_ARROW
  125. "DIAMOND", // SYM_D_DIAMOND
  126. "OVAL", // SYM_D_OVAL
  127. "STRING", // SYM_D_STRING
  128. "BOX", // SYM_D_BOX
  129. "FLAT_BOX", // SYM_D_FLAT_BOX
  130. "CHECK", // SYM_D_CHECK
  131. "OPTION", // SYM_D_OPTION
  132. "CROSS", // SYM_D_CROSS
  133. "RAMP", // SYM_D_RAMP
  134. "TAB", // SYM_D_TAB
  135. "SHADOW_GAP", // SYM_D_SHADOW_GAP
  136. "BOX_GAP", // SYM_D_BOX_GAP
  137. "EXTENSION", // SYM_D_EXTENSION
  138. "FOCUS", // SYM_D_FOCUS
  139. "SLIDER", // SYM_D_SLIDER
  140. "ENTRY", // SYM_D_ENTRY
  141. "HANDLE", // SYM_D_HANDLE
  142. "STEPPER", // SYM_D_STEPPER
  143. "TRUE", // SYM_TRUE
  144. "FALSE", // SYM_FALSE
  145. "TOP", // SYM_TOP
  146. "UP", // SYM_UP
  147. "BOTTOM", // SYM_BOTTOM
  148. "DOWN", // SYM_DOWN
  149. "LEFT", // SYM_LEFT
  150. "RIGHT", // SYM_RIGHT
  151. "NORMAL", // SYM_NORMAL
  152. "ACTIVE", // SYM_ACTIVE
  153. "PRELIGHT", // SYM_PRELIGHT
  154. "SELECTED", // SYM_SELECTED
  155. "INSENSITIVE", // SYM_INSENSITIVE
  156. "NONE", // SYM_NONE
  157. "IN", // SYM_IN
  158. "OUT", // SYM_OUT
  159. "ETCHED_IN", // SYM_ETCHED_IN
  160. "ETCHED_OUT", // SYM_ETCHED_OUT
  161. "HORIZONTAL", // SYM_HORIZONTAL
  162. "VERTICAL" // SYM_VERTICAL
  163. };
  164. private static class PixmapEngineInfo extends GTKParser.EngineInfo {
  165. ArrayList pInfos = new ArrayList();
  166. GTKStyle constructGTKStyle(GTKStyle.GTKStateInfo[] infoArray,
  167. CircularIdentityList props,
  168. Font font,
  169. int xThickness,
  170. int yThickness,
  171. GTKStyle.GTKStockIconInfo[] stockArray) {
  172. PixmapStyle.Info[] pInfoArray = null;
  173. if (pInfos.size() != 0) {
  174. pInfoArray = new PixmapStyle.Info[pInfos.size()];
  175. pInfoArray = (PixmapStyle.Info[])pInfos.toArray(pInfoArray);
  176. }
  177. return new PixmapStyle(infoArray,
  178. props,
  179. font,
  180. xThickness,
  181. yThickness,
  182. stockArray,
  183. pInfoArray);
  184. }
  185. }
  186. private GTKScanner scanner;
  187. private GTKParser parser;
  188. private PixmapEngineInfo engineInfo;
  189. private void registerSymbolsIfNecessary() {
  190. if (scanner.containsSymbol(symbolNames[0])) {
  191. return;
  192. }
  193. for (int i = 0; i < symbolNames.length; i++) {
  194. scanner.addSymbol(symbolNames[i], symbolVals[i]);
  195. }
  196. }
  197. int parse(GTKScanner scanner,
  198. GTKParser parser,
  199. GTKParser.EngineInfo[] retVal) throws IOException {
  200. this.scanner = scanner;
  201. this.parser = parser;
  202. if (retVal[0] == null) {
  203. engineInfo = new PixmapEngineInfo();
  204. } else {
  205. engineInfo = (PixmapEngineInfo)retVal[0];
  206. }
  207. int oldScope = scanner.setScope(uniqueScopeID);
  208. registerSymbolsIfNecessary();
  209. PixmapStyle.Info info[] = new PixmapStyle.Info[1];
  210. int token;
  211. token = scanner.peekNextToken();
  212. while (token != GTKScanner.TOKEN_RIGHT_CURLY) {
  213. switch(token) {
  214. case SYM_IMAGE:
  215. token = parseImage(info);
  216. break;
  217. default:
  218. scanner.getToken();
  219. token = GTKScanner.TOKEN_RIGHT_CURLY;
  220. break;
  221. }
  222. if (token != GTKScanner.TOKEN_NONE) {
  223. return token;
  224. }
  225. engineInfo.pInfos.add(info[0]);
  226. token = scanner.peekNextToken();
  227. }
  228. scanner.getToken();
  229. retVal[0] = engineInfo;
  230. scanner.setScope(oldScope);
  231. return GTKScanner.TOKEN_NONE;
  232. }
  233. private int parseImage(PixmapStyle.Info[] retVal) throws IOException {
  234. int token;
  235. token = scanner.getToken();
  236. if (token != SYM_IMAGE) {
  237. return SYM_IMAGE;
  238. }
  239. token = scanner.getToken();
  240. if (token != GTKScanner.TOKEN_LEFT_CURLY) {
  241. return GTKScanner.TOKEN_LEFT_CURLY;
  242. }
  243. PixmapStyle.Info info = new PixmapStyle.Info();
  244. // to hold the return value from parseFile
  245. String[] fileName = new String[1];
  246. // to hold the return value from parseStretch
  247. boolean[] stretch = new boolean[1];
  248. // to hold the return value from parseBorder
  249. Insets[] insets = new Insets[1];
  250. token = scanner.peekNextToken();
  251. while (token != GTKScanner.TOKEN_RIGHT_CURLY) {
  252. switch(token) {
  253. case SYM_FUNCTION:
  254. token = parseFunction(info);
  255. break;
  256. case SYM_RECOLORABLE:
  257. token = parseRecolorable(info);
  258. break;
  259. case SYM_DETAIL:
  260. token = parseDetail(info);
  261. break;
  262. case SYM_STATE:
  263. token = parseState(info);
  264. break;
  265. case SYM_SHADOW:
  266. token = parseShadow(info);
  267. break;
  268. case SYM_GAP_SIDE:
  269. token = parseGapSide(info);
  270. break;
  271. case SYM_ARROW_DIRECTION:
  272. token = parseArrowDirection(info);
  273. break;
  274. case SYM_ORIENTATION:
  275. token = parseOrientation(info);
  276. break;
  277. case SYM_FILE:
  278. token = parseFile(fileName);
  279. if (token == GTKScanner.TOKEN_NONE) {
  280. info.image = fileName[0];
  281. }
  282. break;
  283. case SYM_BORDER:
  284. token = parseBorder(insets);
  285. if (token == GTKScanner.TOKEN_NONE) {
  286. info.fileInsets = insets[0];
  287. }
  288. break;
  289. case SYM_STRETCH:
  290. token = parseStretch(stretch);
  291. if (token == GTKScanner.TOKEN_NONE) {
  292. info.stretch = stretch[0];
  293. }
  294. break;
  295. case SYM_GAP_FILE:
  296. token = parseFile(fileName);
  297. if (token == GTKScanner.TOKEN_NONE) {
  298. info.gapImage = fileName[0];
  299. }
  300. break;
  301. case SYM_GAP_BORDER:
  302. token = parseBorder(insets);
  303. if (token == GTKScanner.TOKEN_NONE) {
  304. info.gapInsets = insets[0];
  305. }
  306. break;
  307. case SYM_GAP_START_FILE:
  308. token = parseFile(fileName);
  309. if (token == GTKScanner.TOKEN_NONE) {
  310. info.gapStartImage = fileName[0];
  311. }
  312. break;
  313. case SYM_GAP_START_BORDER:
  314. token = parseBorder(insets);
  315. if (token == GTKScanner.TOKEN_NONE) {
  316. info.gapStartInsets = insets[0];
  317. }
  318. break;
  319. case SYM_GAP_END_FILE:
  320. token = parseFile(fileName);
  321. if (token == GTKScanner.TOKEN_NONE) {
  322. info.gapEndImage = fileName[0];
  323. }
  324. break;
  325. case SYM_GAP_END_BORDER:
  326. token = parseBorder(insets);
  327. if (token == GTKScanner.TOKEN_NONE) {
  328. info.gapEndInsets = insets[0];
  329. }
  330. break;
  331. case SYM_OVERLAY_FILE:
  332. token = parseFile(fileName);
  333. if (token == GTKScanner.TOKEN_NONE) {
  334. info.overlayImage = fileName[0];
  335. }
  336. break;
  337. case SYM_OVERLAY_BORDER:
  338. token = parseBorder(insets);
  339. if (token == GTKScanner.TOKEN_NONE) {
  340. info.overlayInsets = insets[0];
  341. }
  342. break;
  343. case SYM_OVERLAY_STRETCH:
  344. token = parseStretch(stretch);
  345. if (token == GTKScanner.TOKEN_NONE) {
  346. info.overlayStretch = stretch[0];
  347. }
  348. break;
  349. default:
  350. scanner.getToken();
  351. token = GTKScanner.TOKEN_RIGHT_CURLY;
  352. break;
  353. }
  354. if (token != GTKScanner.TOKEN_NONE) {
  355. return token;
  356. }
  357. token = scanner.peekNextToken();
  358. }
  359. token = scanner.getToken();
  360. if (token != GTKScanner.TOKEN_RIGHT_CURLY) {
  361. return GTKScanner.TOKEN_RIGHT_CURLY;
  362. }
  363. // PENDING(shannonh) - may want to do some validation of the
  364. // info before we return it
  365. retVal[0] = info;
  366. return GTKScanner.TOKEN_NONE;
  367. }
  368. private int parseFunction(PixmapStyle.Info info) throws IOException {
  369. int token;
  370. token = scanner.getToken();
  371. if (token != SYM_FUNCTION) {
  372. return SYM_FUNCTION;
  373. }
  374. token = scanner.getToken();
  375. if (token != GTKScanner.TOKEN_EQUAL_SIGN) {
  376. return GTKScanner.TOKEN_EQUAL_SIGN;
  377. }
  378. token = scanner.getToken();
  379. if (token >= SYM_D_HLINE && token <= SYM_D_STEPPER) {
  380. info.setFunction(symbolNames[token - SYM_IMAGE]);
  381. }
  382. // PENDING(shannonh) - should we complain if not a valid function?
  383. return GTKScanner.TOKEN_NONE;
  384. }
  385. private int parseRecolorable(PixmapStyle.Info info) throws IOException {
  386. int token;
  387. token = scanner.getToken();
  388. if (token != SYM_RECOLORABLE) {
  389. return SYM_RECOLORABLE;
  390. }
  391. token = scanner.getToken();
  392. if (token != GTKScanner.TOKEN_EQUAL_SIGN) {
  393. return GTKScanner.TOKEN_EQUAL_SIGN;
  394. }
  395. token = scanner.getToken();
  396. if (token == SYM_TRUE) {
  397. info.recolorable = true;
  398. } else if (token == SYM_FALSE) {
  399. info.recolorable = false;
  400. } else {
  401. return SYM_TRUE;
  402. }
  403. return GTKScanner.TOKEN_NONE;
  404. }
  405. private int parseDetail(PixmapStyle.Info info) throws IOException {
  406. int token;
  407. token = scanner.getToken();
  408. if (token != SYM_DETAIL) {
  409. return SYM_DETAIL;
  410. }
  411. token = scanner.getToken();
  412. if (token != GTKScanner.TOKEN_EQUAL_SIGN) {
  413. return GTKScanner.TOKEN_EQUAL_SIGN;
  414. }
  415. token = scanner.getToken();
  416. if (token != GTKScanner.TOKEN_STRING) {
  417. return GTKScanner.TOKEN_STRING;
  418. }
  419. info.setDetail(scanner.currValue.stringVal);
  420. return GTKScanner.TOKEN_NONE;
  421. }
  422. private int parseState(PixmapStyle.Info info) throws IOException {
  423. int token;
  424. token = scanner.getToken();
  425. if (token != SYM_STATE) {
  426. return SYM_STATE;
  427. }
  428. token = scanner.getToken();
  429. if (token != GTKScanner.TOKEN_EQUAL_SIGN) {
  430. return GTKScanner.TOKEN_EQUAL_SIGN;
  431. }
  432. token = scanner.getToken();
  433. switch(token) {
  434. case SYM_NORMAL:
  435. info.componentState = SynthConstants.ENABLED;
  436. break;
  437. case SYM_ACTIVE:
  438. info.componentState = SynthConstants.PRESSED;
  439. break;
  440. case SYM_PRELIGHT:
  441. info.componentState = SynthConstants.MOUSE_OVER;
  442. break;
  443. case SYM_SELECTED:
  444. info.componentState = SynthConstants.SELECTED;
  445. break;
  446. case SYM_INSENSITIVE:
  447. info.componentState = SynthConstants.DISABLED;
  448. break;
  449. default:
  450. return SYM_NORMAL;
  451. }
  452. return GTKScanner.TOKEN_NONE;
  453. }
  454. private int parseShadow(PixmapStyle.Info info) throws IOException {
  455. int token;
  456. token = scanner.getToken();
  457. if (token != SYM_SHADOW) {
  458. return SYM_SHADOW;
  459. }
  460. token = scanner.getToken();
  461. if (token != GTKScanner.TOKEN_EQUAL_SIGN) {
  462. return GTKScanner.TOKEN_EQUAL_SIGN;
  463. }
  464. token = scanner.getToken();
  465. switch(token) {
  466. case SYM_NONE:
  467. info.shadow = GTKConstants.SHADOW_NONE;
  468. break;
  469. case SYM_IN:
  470. info.shadow = GTKConstants.SHADOW_IN;
  471. break;
  472. case SYM_OUT:
  473. info.shadow = GTKConstants.SHADOW_OUT;
  474. break;
  475. case SYM_ETCHED_IN:
  476. info.shadow = GTKConstants.SHADOW_ETCHED_IN;
  477. break;
  478. case SYM_ETCHED_OUT:
  479. info.shadow = GTKConstants.SHADOW_ETCHED_OUT;
  480. break;
  481. default:
  482. return SYM_NONE;
  483. }
  484. return GTKScanner.TOKEN_NONE;
  485. }
  486. private int parseGapSide(PixmapStyle.Info info) throws IOException {
  487. int token;
  488. token = scanner.getToken();
  489. if (token != SYM_GAP_SIDE) {
  490. return SYM_GAP_SIDE;
  491. }
  492. token = scanner.getToken();
  493. if (token != GTKScanner.TOKEN_EQUAL_SIGN) {
  494. return GTKScanner.TOKEN_EQUAL_SIGN;
  495. }
  496. token = scanner.getToken();
  497. switch(token) {
  498. case SYM_TOP:
  499. info.gapSide = GTKConstants.TOP;
  500. break;
  501. case SYM_BOTTOM:
  502. info.gapSide = GTKConstants.BOTTOM;
  503. break;
  504. case SYM_LEFT:
  505. info.gapSide = GTKConstants.LEFT;
  506. break;
  507. case SYM_RIGHT:
  508. info.gapSide = GTKConstants.RIGHT;
  509. break;
  510. default:
  511. return SYM_TOP;
  512. }
  513. return GTKScanner.TOKEN_NONE;
  514. }
  515. private int parseArrowDirection(PixmapStyle.Info info) throws IOException {
  516. int token;
  517. token = scanner.getToken();
  518. if (token != SYM_ARROW_DIRECTION) {
  519. return SYM_ARROW_DIRECTION;
  520. }
  521. token = scanner.getToken();
  522. if (token != GTKScanner.TOKEN_EQUAL_SIGN) {
  523. return GTKScanner.TOKEN_EQUAL_SIGN;
  524. }
  525. token = scanner.getToken();
  526. switch(token) {
  527. case SYM_UP:
  528. info.arrowDirection = GTKConstants.ARROW_UP;
  529. break;
  530. case SYM_DOWN:
  531. info.arrowDirection = GTKConstants.ARROW_DOWN;
  532. break;
  533. case SYM_LEFT:
  534. info.arrowDirection = GTKConstants.ARROW_LEFT;
  535. break;
  536. case SYM_RIGHT:
  537. info.arrowDirection = GTKConstants.ARROW_RIGHT;
  538. break;
  539. default:
  540. return SYM_UP;
  541. }
  542. return GTKScanner.TOKEN_NONE;
  543. }
  544. private int parseOrientation(PixmapStyle.Info info) throws IOException {
  545. int token;
  546. token = scanner.getToken();
  547. if (token != SYM_ORIENTATION) {
  548. return SYM_ORIENTATION;
  549. }
  550. token = scanner.getToken();
  551. if (token != GTKScanner.TOKEN_EQUAL_SIGN) {
  552. return GTKScanner.TOKEN_EQUAL_SIGN;
  553. }
  554. token = scanner.getToken();
  555. switch(token) {
  556. case SYM_HORIZONTAL:
  557. info.orientation = GTKConstants.HORIZONTAL;
  558. break;
  559. case SYM_VERTICAL:
  560. info.orientation = GTKConstants.VERTICAL;
  561. break;
  562. default:
  563. return SYM_HORIZONTAL;
  564. }
  565. return GTKScanner.TOKEN_NONE;
  566. }
  567. private int parseFile(String[] retVal) throws IOException {
  568. int token;
  569. token = scanner.getToken();
  570. token = scanner.getToken();
  571. if (token != GTKScanner.TOKEN_EQUAL_SIGN) {
  572. return GTKScanner.TOKEN_EQUAL_SIGN;
  573. }
  574. token = scanner.getToken();
  575. if (token != GTKScanner.TOKEN_STRING) {
  576. return GTKScanner.TOKEN_STRING;
  577. }
  578. retVal[0] = parser.resolvePixmapPath(scanner.currValue.stringVal);
  579. return GTKScanner.TOKEN_NONE;
  580. }
  581. private int parseStretch(boolean[] retVal) throws IOException {
  582. int token;
  583. token = scanner.getToken();
  584. token = scanner.getToken();
  585. if (token != GTKScanner.TOKEN_EQUAL_SIGN) {
  586. return GTKScanner.TOKEN_EQUAL_SIGN;
  587. }
  588. token = scanner.getToken();
  589. switch(token) {
  590. case SYM_TRUE:
  591. retVal[0] = true;
  592. break;
  593. case SYM_FALSE:
  594. retVal[0] = false;
  595. break;
  596. default:
  597. return SYM_TRUE;
  598. }
  599. return GTKScanner.TOKEN_NONE;
  600. }
  601. private int parseBorder(Insets[] retVal) throws IOException {
  602. int left = 0;
  603. int right = 0;
  604. int top = 0;
  605. int bottom = 0;
  606. scanner.getToken();
  607. if (scanner.getToken() != GTKScanner.TOKEN_EQUAL_SIGN) {
  608. return GTKScanner.TOKEN_EQUAL_SIGN;
  609. }
  610. if (scanner.getToken() != GTKScanner.TOKEN_LEFT_CURLY) {
  611. return GTKScanner.TOKEN_LEFT_CURLY;
  612. }
  613. if (scanner.getToken() != GTKScanner.TOKEN_INT) {
  614. return GTKScanner.TOKEN_INT;
  615. }
  616. left = (int)scanner.currValue.longVal;
  617. if (scanner.getToken() != GTKScanner.TOKEN_COMMA) {
  618. return GTKScanner.TOKEN_COMMA;
  619. }
  620. if (scanner.getToken() != GTKScanner.TOKEN_INT) {
  621. return GTKScanner.TOKEN_INT;
  622. }
  623. right = (int)scanner.currValue.longVal;
  624. if (scanner.getToken() != GTKScanner.TOKEN_COMMA) {
  625. return GTKScanner.TOKEN_COMMA;
  626. }
  627. if (scanner.getToken() != GTKScanner.TOKEN_INT) {
  628. return GTKScanner.TOKEN_INT;
  629. }
  630. top = (int)scanner.currValue.longVal;
  631. if (scanner.getToken() != GTKScanner.TOKEN_COMMA) {
  632. return GTKScanner.TOKEN_COMMA;
  633. }
  634. if (scanner.getToken() != GTKScanner.TOKEN_INT) {
  635. return GTKScanner.TOKEN_INT;
  636. }
  637. bottom = (int)scanner.currValue.longVal;
  638. if (scanner.getToken() != GTKScanner.TOKEN_RIGHT_CURLY) {
  639. return GTKScanner.TOKEN_RIGHT_CURLY;
  640. }
  641. retVal[0] = new Insets(top, left, bottom, right);
  642. return GTKScanner.TOKEN_NONE;
  643. }
  644. }