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