1 /*******************************************************************************
2  * Copyright (c) 2000, 2003 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Common Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/cpl-v10.html
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package net.sourceforge.phpdt.internal.ui.viewsupport;
12 
13 import net.sourceforge.phpdt.core.ICompilationUnit;
14 import net.sourceforge.phpdt.core.IField;
15 import net.sourceforge.phpdt.core.IJavaElement;
16 import net.sourceforge.phpdt.core.IMethod;
17 import net.sourceforge.phpdt.core.IPackageFragment;
18 import net.sourceforge.phpdt.core.IPackageFragmentRoot;
19 import net.sourceforge.phpdt.core.IType;
20 import net.sourceforge.phpdt.core.JavaModelException;
21 import net.sourceforge.phpdt.core.Signature;
22 import net.sourceforge.phpdt.internal.corext.util.JavaModelUtil;
23 import net.sourceforge.phpdt.internal.ui.PHPUIMessages;
24 import net.sourceforge.phpdt.ui.PreferenceConstants;
25 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
26 
27 import org.eclipse.core.resources.IResource;
28 import org.eclipse.core.runtime.IAdaptable;
29 import org.eclipse.core.runtime.IPath;
30 import org.eclipse.jface.preference.IPreferenceStore;
31 import org.eclipse.ui.model.IWorkbenchAdapter;
32 
33 public class JavaElementLabels {
34 
35 	/**
36 	 * Method names contain parameter types. e.g. <code>foo(int)</code>
37 	 */
38 	public final static int M_PARAMETER_TYPES = 1 << 0;
39 
40 	/**
41 	 * Method names contain parameter names. e.g. <code>foo(index)</code>
42 	 */
43 	public final static int M_PARAMETER_NAMES = 1 << 1;
44 
45 	/**
46 	 * Method names contain thrown exceptions. e.g.
47 	 * <code>foo throws IOException</code>
48 	 */
49 	public final static int M_EXCEPTIONS = 1 << 2;
50 
51 	/**
52 	 * Method names contain return type (appended) e.g. <code>foo : int</code>
53 	 */
54 	public final static int M_APP_RETURNTYPE = 1 << 3;
55 
56 	/**
57 	 * Method names contain return type (appended) e.g. <code>int foo</code>
58 	 */
59 	public final static int M_PRE_RETURNTYPE = 1 << 4;
60 
61 	/**
62 	 * Method names are fully qualified. e.g. <code>java.util.Vector.size</code>
63 	 */
64 	public final static int M_FULLY_QUALIFIED = 1 << 5;
65 
66 	/**
67 	 * Method names are post qualified. e.g.
68 	 * <code>size - java.util.Vector</code>
69 	 */
70 	public final static int M_POST_QUALIFIED = 1 << 6;
71 
72 	/**
73 	 * Initializer names are fully qualified. e.g.
74 	 * <code>java.util.Vector.{ ... }</code>
75 	 */
76 	public final static int I_FULLY_QUALIFIED = 1 << 7;
77 
78 	/**
79 	 * Type names are post qualified. e.g. <code>{ ... } - java.util.Map</code>
80 	 */
81 	public final static int I_POST_QUALIFIED = 1 << 8;
82 
83 	/**
84 	 * Field names contain the declared type (appended) e.g.
85 	 * <code>int fHello</code>
86 	 */
87 	public final static int F_APP_TYPE_SIGNATURE = 1 << 9;
88 
89 	/**
90 	 * Field names contain the declared type (prepended) e.g.
91 	 * <code>fHello : int</code>
92 	 */
93 	public final static int F_PRE_TYPE_SIGNATURE = 1 << 10;
94 
95 	/**
96 	 * Fields names are fully qualified. e.g. <code>java.lang.System.out</code>
97 	 */
98 	public final static int F_FULLY_QUALIFIED = 1 << 11;
99 
100 	/**
101 	 * Fields names are post qualified. e.g. <code>out - java.lang.System</code>
102 	 */
103 	public final static int F_POST_QUALIFIED = 1 << 12;
104 
105 	/**
106 	 * Type names are fully qualified. e.g. <code>java.util.Map.MapEntry</code>
107 	 */
108 	public final static int T_FULLY_QUALIFIED = 1 << 13;
109 
110 	/**
111 	 * Type names are type container qualified. e.g. <code>Map.MapEntry</code>
112 	 */
113 	public final static int T_CONTAINER_QUALIFIED = 1 << 14;
114 
115 	/**
116 	 * Type names are post qualified. e.g. <code>MapEntry - java.util.Map</code>
117 	 */
118 	public final static int T_POST_QUALIFIED = 1 << 15;
119 
120 	/**
121 	 * Declarations (import container / declarartion, package declarartion) are
122 	 * qualified. e.g. <code>java.util.Vector.class/import container</code>
123 	 */
124 	public final static int D_QUALIFIED = 1 << 16;
125 
126 	/**
127 	 * Declarations (import container / declarartion, package declarartion) are
128 	 * post qualified. e.g.
129 	 * <code>import container - java.util.Vector.class</code>
130 	 */
131 	public final static int D_POST_QUALIFIED = 1 << 17;
132 
133 	/**
134 	 * Class file names are fully qualified. e.g.
135 	 * <code>java.util.Vector.class</code>
136 	 */
137 	public final static int CF_QUALIFIED = 1 << 18;
138 
139 	/**
140 	 * Class file names are post qualified. e.g.
141 	 * <code>Vector.class - java.util</code>
142 	 */
143 	public final static int CF_POST_QUALIFIED = 1 << 19;
144 
145 	/**
146 	 * Compilation unit names are fully qualified. e.g.
147 	 * <code>java.util.Vector.java</code>
148 	 */
149 	public final static int CU_QUALIFIED = 1 << 20;
150 
151 	/**
152 	 * Compilation unit names are post qualified. e.g.
153 	 * <code>Vector.java - java.util</code>
154 	 */
155 	public final static int CU_POST_QUALIFIED = 1 << 21;
156 
157 	/**
158 	 * Package names are qualified. e.g. <code>MyProject/src/java.util</code>
159 	 */
160 	public final static int P_QUALIFIED = 1 << 22;
161 
162 	/**
163 	 * Package names are post qualified. e.g.
164 	 * <code>java.util - MyProject/src</code>
165 	 */
166 	public final static int P_POST_QUALIFIED = 1 << 23;
167 
168 	/**
169 	 * Package Fragment Roots contain variable name if from a variable. e.g.
170 	 * <code>JRE_LIB - c:\java\lib\rt.jar</code>
171 	 */
172 	public final static int ROOT_VARIABLE = 1 << 24;
173 
174 	/**
175 	 * Package Fragment Roots contain the project name if not an archive
176 	 * (prepended). e.g. <code>MyProject/src</code>
177 	 */
178 	public final static int ROOT_QUALIFIED = 1 << 25;
179 
180 	/**
181 	 * Package Fragment Roots contain the project name if not an archive
182 	 * (appended). e.g. <code>src - MyProject</code>
183 	 */
184 	public final static int ROOT_POST_QUALIFIED = 1 << 26;
185 
186 	/**
187 	 * Add root path to all elements except Package Fragment Roots and Java
188 	 * projects. e.g. <code>java.lang.Vector - c:\java\lib\rt.jar</code>
189 	 * Option only applies to getElementLabel
190 	 */
191 	public final static int APPEND_ROOT_PATH = 1 << 27;
192 
193 	/**
194 	 * Add root path to all elements except Package Fragment Roots and Java
195 	 * projects. e.g. <code>java.lang.Vector - c:\java\lib\rt.jar</code>
196 	 * Option only applies to getElementLabel
197 	 */
198 	public final static int PREPEND_ROOT_PATH = 1 << 28;
199 
200 	/**
201 	 * Package names are compressed. e.g. <code>o*.e*.search</code>
202 	 */
203 	public final static int P_COMPRESSED = 1 << 29;
204 
205 	/**
206 	 * Post qualify referenced package fragement roots. For example
207 	 * <code>jdt.jar - net.sourceforge.phpdt.ui</code> if the jar is
208 	 * referenced from another project.
209 	 */
210 	public final static int REFERENCED_ROOT_POST_QUALIFIED = 1 << 30;
211 
212 	/**
213 	 * Qualify all elements
214 	 */
215 	public final static int ALL_FULLY_QUALIFIED = F_FULLY_QUALIFIED
216 			| M_FULLY_QUALIFIED | I_FULLY_QUALIFIED | T_FULLY_QUALIFIED
217 			| D_QUALIFIED | CF_QUALIFIED | CU_QUALIFIED | P_QUALIFIED
218 			| ROOT_QUALIFIED;
219 
220 	/**
221 	 * Post qualify all elements
222 	 */
223 	public final static int ALL_POST_QUALIFIED = F_POST_QUALIFIED
224 			| M_POST_QUALIFIED | I_POST_QUALIFIED | T_POST_QUALIFIED
225 			| D_POST_QUALIFIED | CF_POST_QUALIFIED | CU_POST_QUALIFIED
226 			| P_POST_QUALIFIED | ROOT_POST_QUALIFIED;
227 
228 	/**
229 	 * Default options (M_PARAMETER_TYPES enabled)
230 	 */
231 	public final static int ALL_DEFAULT = M_PARAMETER_TYPES;
232 
233 	/**
234 	 * Default qualify options (All except Root and Package)
235 	 */
236 	public final static int DEFAULT_QUALIFIED = F_FULLY_QUALIFIED
237 			| M_FULLY_QUALIFIED | I_FULLY_QUALIFIED | T_FULLY_QUALIFIED
238 			| D_QUALIFIED | CF_QUALIFIED | CU_QUALIFIED;
239 
240 	/**
241 	 * Default post qualify options (All except Root and Package)
242 	 */
243 	public final static int DEFAULT_POST_QUALIFIED = F_POST_QUALIFIED
244 			| M_POST_QUALIFIED | I_POST_QUALIFIED | T_POST_QUALIFIED
245 			| D_POST_QUALIFIED | CF_POST_QUALIFIED | CU_POST_QUALIFIED;
246 
247 	public final static String CONCAT_STRING = PHPUIMessages
248 			.getString("JavaElementLabels.concat_string"); // " - ";
249 															// //$NON-NLS-1$
250 
251 	public final static String COMMA_STRING = PHPUIMessages
252 			.getString("JavaElementLabels.comma_string"); // ", ";
253 															// //$NON-NLS-1$
254 
255 	public final static String DECL_STRING = PHPUIMessages
256 			.getString("JavaElementLabels.declseparator_string"); // " "; //
257 																	// use for
258 																	// return
259 																	// type
260 																	// //$NON-NLS-1$
261 
262 	/*
263 	 * Package name compression
264 	 */
265 	private static String fgPkgNamePattern = ""; //$NON-NLS-1$
266 
267 	private static String fgPkgNamePrefix;
268 
269 	private static String fgPkgNamePostfix;
270 
271 	private static int fgPkgNameChars;
272 
273 	private static int fgPkgNameLength = -1;
274 
JavaElementLabels()275 	private JavaElementLabels() {
276 	}
277 
getFlag(int flags, int flag)278 	private static boolean getFlag(int flags, int flag) {
279 		return (flags & flag) != 0;
280 	}
281 
getTextLabel(Object obj, int flags)282 	public static String getTextLabel(Object obj, int flags) {
283 		if (obj instanceof IJavaElement) {
284 			return getElementLabel((IJavaElement) obj, flags);
285 		} else if (obj instanceof IAdaptable) {
286 			IWorkbenchAdapter wbadapter = (IWorkbenchAdapter) ((IAdaptable) obj)
287 					.getAdapter(IWorkbenchAdapter.class);
288 			if (wbadapter != null) {
289 				return wbadapter.getLabel(obj);
290 			}
291 		}
292 		return ""; //$NON-NLS-1$
293 	}
294 
295 	/**
296 	 * Returns the label for a Java element. Flags as defined above.
297 	 */
getElementLabel(IJavaElement element, int flags)298 	public static String getElementLabel(IJavaElement element, int flags) {
299 		StringBuffer buf = new StringBuffer(60);
300 		getElementLabel(element, flags, buf);
301 		return buf.toString();
302 	}
303 
304 	/**
305 	 * Returns the label for a Java element. Flags as defined above.
306 	 */
getElementLabel(IJavaElement element, int flags, StringBuffer buf)307 	public static void getElementLabel(IJavaElement element, int flags,
308 			StringBuffer buf) {
309 		int type = element.getElementType();
310 		IPackageFragmentRoot root = null;
311 
312 		if (type != IJavaElement.JAVA_MODEL
313 				&& type != IJavaElement.JAVA_PROJECT
314 				&& type != IJavaElement.PACKAGE_FRAGMENT_ROOT)
315 			root = JavaModelUtil.getPackageFragmentRoot(element);
316 		if (root != null && getFlag(flags, PREPEND_ROOT_PATH)) {
317 			getPackageFragmentRootLabel(root, ROOT_QUALIFIED, buf);
318 			buf.append(CONCAT_STRING);
319 		}
320 
321 		switch (type) {
322 		case IJavaElement.METHOD:
323 			getMethodLabel((IMethod) element, flags, buf);
324 			break;
325 		case IJavaElement.FIELD:
326 			getFieldLabel((IField) element, flags, buf);
327 			break;
328 		// case IJavaElement.INITIALIZER:
329 		// getInitializerLabel((IInitializer) element, flags, buf);
330 		// break;
331 		case IJavaElement.TYPE:
332 			getTypeLabel((IType) element, flags, buf);
333 			break;
334 		// case IJavaElement.CLASS_FILE:
335 		// getClassFileLabel((IClassFile) element, flags, buf);
336 		// break;
337 		case IJavaElement.COMPILATION_UNIT:
338 			getCompilationUnitLabel((ICompilationUnit) element, flags, buf);
339 			break;
340 		case IJavaElement.PACKAGE_FRAGMENT:
341 			getPackageFragmentLabel((IPackageFragment) element, flags, buf);
342 			break;
343 		case IJavaElement.PACKAGE_FRAGMENT_ROOT:
344 			getPackageFragmentRootLabel((IPackageFragmentRoot) element, flags,
345 					buf);
346 			break;
347 		case IJavaElement.IMPORT_CONTAINER:
348 		case IJavaElement.IMPORT_DECLARATION:
349 		case IJavaElement.PACKAGE_DECLARATION:
350 			getDeclararionLabel(element, flags, buf);
351 			break;
352 		case IJavaElement.JAVA_PROJECT:
353 		case IJavaElement.JAVA_MODEL:
354 			buf.append(element.getElementName());
355 			break;
356 		default:
357 			buf.append(element.getElementName());
358 		}
359 
360 		if (root != null && getFlag(flags, APPEND_ROOT_PATH)) {
361 			buf.append(CONCAT_STRING);
362 			getPackageFragmentRootLabel(root, ROOT_QUALIFIED, buf);
363 		}
364 	}
365 
366 	/**
367 	 * Appends the label for a method to a StringBuffer. Considers the M_*
368 	 * flags.
369 	 */
getMethodLabel(IMethod method, int flags, StringBuffer buf)370 	public static void getMethodLabel(IMethod method, int flags,
371 			StringBuffer buf) {
372 		try {
373 			// return type
374 			if (getFlag(flags, M_PRE_RETURNTYPE) && method.exists()
375 					&& !method.isConstructor()) {
376 				buf.append(Signature.getSimpleName(Signature.toString(method
377 						.getReturnType())));
378 				buf.append(' ');
379 			}
380 
381 			// qualification
382 			if (getFlag(flags, M_FULLY_QUALIFIED)) {
383 				getTypeLabel(method.getDeclaringType(), T_FULLY_QUALIFIED
384 						| (flags & P_COMPRESSED), buf);
385 				buf.append('.');
386 			}
387 
388 			buf.append(method.getElementName());
389 
390 			// parameters
391 			if (getFlag(flags, M_PARAMETER_TYPES | M_PARAMETER_NAMES)) {
392 				buf.append('(');
393 
394 				String[] types = getFlag(flags, M_PARAMETER_TYPES) ? method
395 						.getParameterTypes() : null;
396 				String[] names = (getFlag(flags, M_PARAMETER_NAMES) && method
397 						.exists()) ? method.getParameterNames() : null;
398 				int nParams = types != null ? types.length : names.length;
399 
400 				for (int i = 0; i < nParams; i++) {
401 					if (i > 0) {
402 						buf.append(COMMA_STRING); //$NON-NLS-1$
403 					}
404 					if (types != null) {
405 						buf.append(Signature.getSimpleName(Signature
406 								.toString(types[i])));
407 					}
408 					if (names != null) {
409 						if (types != null) {
410 							buf.append(' ');
411 						}
412 						buf.append(names[i]);
413 					}
414 				}
415 				buf.append(')');
416 			}
417 
418 			if (getFlag(flags, M_EXCEPTIONS) && method.exists()) {
419 				String[] types = method.getExceptionTypes();
420 				if (types.length > 0) {
421 					buf.append(" throws "); //$NON-NLS-1$
422 					for (int i = 0; i < types.length; i++) {
423 						if (i > 0) {
424 							buf.append(COMMA_STRING);
425 						}
426 						buf.append(Signature.getSimpleName(Signature
427 								.toString(types[i])));
428 					}
429 				}
430 			}
431 
432 			if (getFlag(flags, M_APP_RETURNTYPE) && method.exists()
433 					&& !method.isConstructor()) {
434 				buf.append(DECL_STRING);
435 				buf.append(Signature.getSimpleName(Signature.toString(method
436 						.getReturnType())));
437 			}
438 
439 			// post qualification
440 			if (getFlag(flags, M_POST_QUALIFIED)) {
441 				buf.append(CONCAT_STRING);
442 				getTypeLabel(method.getDeclaringType(), T_FULLY_QUALIFIED
443 						| (flags & P_COMPRESSED), buf);
444 			}
445 
446 		} catch (JavaModelException e) {
447 			PHPeclipsePlugin.log(e); // NotExistsException will not reach
448 										// this point
449 		}
450 	}
451 
452 	/**
453 	 * Appends the label for a field to a StringBuffer. Considers the F_* flags.
454 	 */
getFieldLabel(IField field, int flags, StringBuffer buf)455 	public static void getFieldLabel(IField field, int flags, StringBuffer buf) {
456 		try {
457 			if (getFlag(flags, F_PRE_TYPE_SIGNATURE) && field.exists()) {
458 				buf.append(Signature.toString(field.getTypeSignature()));
459 				buf.append(' ');
460 			}
461 
462 			// qualification
463 			if (getFlag(flags, F_FULLY_QUALIFIED)) {
464 				getTypeLabel(field.getDeclaringType(), T_FULLY_QUALIFIED
465 						| (flags & P_COMPRESSED), buf);
466 				buf.append('.');
467 			}
468 			buf.append(field.getElementName());
469 
470 			if (getFlag(flags, F_APP_TYPE_SIGNATURE) && field.exists()) {
471 				buf.append(DECL_STRING);
472 				buf.append(Signature.toString(field.getTypeSignature()));
473 			}
474 
475 			// post qualification
476 			if (getFlag(flags, F_POST_QUALIFIED)) {
477 				buf.append(CONCAT_STRING);
478 				getTypeLabel(field.getDeclaringType(), T_FULLY_QUALIFIED
479 						| (flags & P_COMPRESSED), buf);
480 			}
481 
482 		} catch (JavaModelException e) {
483 			PHPeclipsePlugin.log(e); // NotExistsException will not reach
484 										// this point
485 		}
486 	}
487 
488 	/**
489 	 * Appends the label for a initializer to a StringBuffer. Considers the I_*
490 	 * flags.
491 	 */
492 	// public static void getInitializerLabel(IInitializer initializer, int
493 	// flags, StringBuffer buf) {
494 	// // qualification
495 	// if (getFlag(flags, I_FULLY_QUALIFIED)) {
496 	// getTypeLabel(initializer.getDeclaringType(), T_FULLY_QUALIFIED | (flags &
497 	// P_COMPRESSED), buf);
498 	// buf.append('.');
499 	// }
500 	// buf.append(JavaUIMessages.getString("JavaElementLabels.initializer"));
501 	// //$NON-NLS-1$
502 	//
503 	// // post qualification
504 	// if (getFlag(flags, I_POST_QUALIFIED)) {
505 	// buf.append(CONCAT_STRING);
506 	// getTypeLabel(initializer.getDeclaringType(), T_FULLY_QUALIFIED | (flags &
507 	// P_COMPRESSED), buf);
508 	// }
509 	// }
510 	/**
511 	 * Appends the label for a type to a StringBuffer. Considers the T_* flags.
512 	 */
getTypeLabel(IType type, int flags, StringBuffer buf)513 	public static void getTypeLabel(IType type, int flags, StringBuffer buf) {
514 		if (getFlag(flags, T_FULLY_QUALIFIED)) {
515 			if (type != null) { // jsurfer INSERT
516 				IPackageFragment pack = type.getPackageFragment();
517 				if (!pack.isDefaultPackage()) {
518 					getPackageFragmentLabel(pack, (flags & P_COMPRESSED), buf);
519 					buf.append('.');
520 				}
521 				buf.append(JavaModelUtil.getTypeQualifiedName(type));
522 			} // jsurfer INSERT
523 		} else if (getFlag(flags, T_CONTAINER_QUALIFIED)) {
524 			buf.append(JavaModelUtil.getTypeQualifiedName(type));
525 		} else {
526 			buf.append(type.getElementName());
527 		}
528 		// post qualification
529 		if (getFlag(flags, T_POST_QUALIFIED)) {
530 			buf.append(CONCAT_STRING);
531 			IType declaringType = type.getDeclaringType();
532 			if (declaringType != null) {
533 				getTypeLabel(declaringType, T_FULLY_QUALIFIED
534 						| (flags & P_COMPRESSED), buf);
535 			} else {
536 				getPackageFragmentLabel(type.getPackageFragment(),
537 						(flags & P_COMPRESSED), buf);
538 			}
539 		}
540 	}
541 
542 	/**
543 	 * Appends the label for a declaration to a StringBuffer. Considers the D_*
544 	 * flags.
545 	 */
getDeclararionLabel(IJavaElement declaration, int flags, StringBuffer buf)546 	public static void getDeclararionLabel(IJavaElement declaration, int flags,
547 			StringBuffer buf) {
548 		if (getFlag(flags, D_QUALIFIED)) {
549 			IJavaElement openable = (IJavaElement) declaration.getOpenable();
550 			if (openable != null) {
551 				buf.append(getElementLabel(openable, CF_QUALIFIED
552 						| CU_QUALIFIED));
553 				buf.append('/');
554 			}
555 		}
556 		if (declaration.getElementType() == IJavaElement.IMPORT_CONTAINER) {
557 			buf.append(PHPUIMessages
558 					.getString("JavaElementLabels.import_container")); //$NON-NLS-1$
559 		} else {
560 			buf.append(declaration.getElementName());
561 		}
562 		// post qualification
563 		if (getFlag(flags, D_POST_QUALIFIED)) {
564 			IJavaElement openable = (IJavaElement) declaration.getOpenable();
565 			if (openable != null) {
566 				buf.append(CONCAT_STRING);
567 				buf.append(getElementLabel(openable, CF_QUALIFIED
568 						| CU_QUALIFIED));
569 			}
570 		}
571 	}
572 
573 	/**
574 	 * Appends the label for a class file to a StringBuffer. Considers the CF_*
575 	 * flags.
576 	 */
577 	// public static void getClassFileLabel(IClassFile classFile, int flags,
578 	// StringBuffer buf) {
579 	// if (getFlag(flags, CF_QUALIFIED)) {
580 	// IPackageFragment pack= (IPackageFragment) classFile.getParent();
581 	// if (!pack.isDefaultPackage()) {
582 	// buf.append(pack.getElementName());
583 	// buf.append('.');
584 	// }
585 	// }
586 	// buf.append(classFile.getElementName());
587 	//
588 	// if (getFlag(flags, CF_POST_QUALIFIED)) {
589 	// buf.append(CONCAT_STRING);
590 	// getPackageFragmentLabel((IPackageFragment) classFile.getParent(), 0,
591 	// buf);
592 	// }
593 	// }
594 	/**
595 	 * Appends the label for a compilation unit to a StringBuffer. Considers the
596 	 * CU_* flags.
597 	 */
getCompilationUnitLabel(ICompilationUnit cu, int flags, StringBuffer buf)598 	public static void getCompilationUnitLabel(ICompilationUnit cu, int flags,
599 			StringBuffer buf) {
600 		if (getFlag(flags, CU_QUALIFIED)) {
601 			IPackageFragment pack = (IPackageFragment) cu.getParent();
602 			if (!pack.isDefaultPackage()) {
603 				buf.append(pack.getElementName());
604 				buf.append('.');
605 			}
606 		}
607 		buf.append(cu.getElementName());
608 
609 		if (getFlag(flags, CU_POST_QUALIFIED)) {
610 			buf.append(CONCAT_STRING);
611 			getPackageFragmentLabel((IPackageFragment) cu.getParent(), 0, buf);
612 		}
613 	}
614 
615 	/**
616 	 * Appends the label for a package fragment to a StringBuffer. Considers the
617 	 * P_* flags.
618 	 */
getPackageFragmentLabel(IPackageFragment pack, int flags, StringBuffer buf)619 	public static void getPackageFragmentLabel(IPackageFragment pack,
620 			int flags, StringBuffer buf) {
621 		if (getFlag(flags, P_QUALIFIED)) {
622 			getPackageFragmentRootLabel(
623 					(IPackageFragmentRoot) pack.getParent(), ROOT_QUALIFIED,
624 					buf);
625 			buf.append('/');
626 		}
627 		refreshPackageNamePattern();
628 		if (pack.isDefaultPackage()) {
629 			buf.append(PHPUIMessages
630 					.getString("JavaElementLabels.default_package")); //$NON-NLS-1$
631 		} else if (getFlag(flags, P_COMPRESSED) && fgPkgNameLength >= 0) {
632 			String name = pack.getElementName();
633 			int start = 0;
634 			int dot = name.indexOf('.', start);
635 			while (dot > 0) {
636 				if (dot - start > fgPkgNameLength - 1) {
637 					buf.append(fgPkgNamePrefix);
638 					if (fgPkgNameChars > 0)
639 						buf.append(name.substring(start, Math.min(start
640 								+ fgPkgNameChars, dot)));
641 					buf.append(fgPkgNamePostfix);
642 				} else
643 					buf.append(name.substring(start, dot + 1));
644 				start = dot + 1;
645 				dot = name.indexOf('.', start);
646 			}
647 			buf.append(name.substring(start));
648 		} else {
649 			buf.append(pack.getElementName());
650 		}
651 		if (getFlag(flags, P_POST_QUALIFIED)) {
652 			buf.append(CONCAT_STRING);
653 			getPackageFragmentRootLabel(
654 					(IPackageFragmentRoot) pack.getParent(), ROOT_QUALIFIED,
655 					buf);
656 		}
657 	}
658 
659 	/**
660 	 * Appends the label for a package fragment root to a StringBuffer.
661 	 * Considers the ROOT_* flags.
662 	 */
getPackageFragmentRootLabel(IPackageFragmentRoot root, int flags, StringBuffer buf)663 	public static void getPackageFragmentRootLabel(IPackageFragmentRoot root,
664 			int flags, StringBuffer buf) {
665 		if (root.isArchive())
666 			getArchiveLabel(root, flags, buf);
667 		else
668 			getFolderLabel(root, flags, buf);
669 	}
670 
getArchiveLabel(IPackageFragmentRoot root, int flags, StringBuffer buf)671 	private static void getArchiveLabel(IPackageFragmentRoot root, int flags,
672 			StringBuffer buf) {
673 		// Handle variables different
674 		if (getFlag(flags, ROOT_VARIABLE) && getVariableLabel(root, flags, buf))
675 			return;
676 		boolean external = root.isExternal();
677 		if (external)
678 			getExternalArchiveLabel(root, flags, buf);
679 		else
680 			getInternalArchiveLabel(root, flags, buf);
681 	}
682 
getVariableLabel(IPackageFragmentRoot root, int flags, StringBuffer buf)683 	private static boolean getVariableLabel(IPackageFragmentRoot root,
684 			int flags, StringBuffer buf) {
685 		// try {
686 		// IClasspathEntry rawEntry= root.getRawClasspathEntry();
687 		// if (rawEntry != null) {
688 		// if (rawEntry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) {
689 		// buf.append(rawEntry.getPath().makeRelative());
690 		// buf.append(CONCAT_STRING);
691 		// if (root.isExternal())
692 		// buf.append(root.getPath().toOSString());
693 		// else
694 		// buf.append(root.getPath().makeRelative().toString());
695 		// return true;
696 		// }
697 		// }
698 		// } catch (JavaModelException e) {
699 		// PHPeclipsePlugin.log(e); // problems with class path
700 		// }
701 		return false;
702 	}
703 
getExternalArchiveLabel(IPackageFragmentRoot root, int flags, StringBuffer buf)704 	private static void getExternalArchiveLabel(IPackageFragmentRoot root,
705 			int flags, StringBuffer buf) {
706 		IPath path = root.getPath();
707 		if (getFlag(flags, REFERENCED_ROOT_POST_QUALIFIED)) {
708 			int segements = path.segmentCount();
709 			if (segements > 0) {
710 				buf.append(path.segment(segements - 1));
711 				if (segements > 1 || path.getDevice() != null) {
712 					buf.append(CONCAT_STRING);
713 					buf.append(path.removeLastSegments(1).toOSString());
714 				}
715 			} else {
716 				buf.append(path.toOSString());
717 			}
718 		} else {
719 			buf.append(path.toOSString());
720 		}
721 	}
722 
getInternalArchiveLabel(IPackageFragmentRoot root, int flags, StringBuffer buf)723 	private static void getInternalArchiveLabel(IPackageFragmentRoot root,
724 			int flags, StringBuffer buf) {
725 		IResource resource = root.getResource();
726 		boolean rootQualified = getFlag(flags, ROOT_QUALIFIED);
727 		boolean referencedQualified = getFlag(flags,
728 				REFERENCED_ROOT_POST_QUALIFIED)
729 				&& JavaModelUtil.isReferenced(root) && resource != null;
730 		if (rootQualified) {
731 			buf.append(root.getPath().makeRelative().toString());
732 		} else {
733 			buf.append(root.getElementName());
734 			if (referencedQualified) {
735 				buf.append(CONCAT_STRING);
736 				buf.append(resource.getParent().getFullPath().makeRelative()
737 						.toString());
738 			} else if (getFlag(flags, ROOT_POST_QUALIFIED)) {
739 				buf.append(CONCAT_STRING);
740 				buf
741 						.append(root.getParent().getPath().makeRelative()
742 								.toString());
743 			}
744 		}
745 	}
746 
getFolderLabel(IPackageFragmentRoot root, int flags, StringBuffer buf)747 	private static void getFolderLabel(IPackageFragmentRoot root, int flags,
748 			StringBuffer buf) {
749 		IResource resource = root.getResource();
750 		boolean rootQualified = getFlag(flags, ROOT_QUALIFIED);
751 		boolean referencedQualified = getFlag(flags,
752 				REFERENCED_ROOT_POST_QUALIFIED)
753 				&& JavaModelUtil.isReferenced(root) && resource != null;
754 		if (rootQualified) {
755 			buf.append(root.getPath().makeRelative().toString());
756 		} else {
757 			if (resource != null)
758 				buf.append(resource.getProjectRelativePath().toString());
759 			else
760 				buf.append(root.getElementName());
761 			if (referencedQualified) {
762 				buf.append(CONCAT_STRING);
763 				buf.append(resource.getProject().getName());
764 			} else if (getFlag(flags, ROOT_POST_QUALIFIED)) {
765 				buf.append(CONCAT_STRING);
766 				buf.append(root.getParent().getElementName());
767 			}
768 		}
769 	}
770 
refreshPackageNamePattern()771 	private static void refreshPackageNamePattern() {
772 		String pattern = getPkgNamePatternForPackagesView();
773 		if (pattern.equals(fgPkgNamePattern))
774 			return;
775 		else if (pattern.equals("")) { //$NON-NLS-1$
776 			fgPkgNamePattern = ""; //$NON-NLS-1$
777 			fgPkgNameLength = -1;
778 			return;
779 		}
780 		fgPkgNamePattern = pattern;
781 		int i = 0;
782 		fgPkgNameChars = 0;
783 		fgPkgNamePrefix = ""; //$NON-NLS-1$
784 		fgPkgNamePostfix = ""; //$NON-NLS-1$
785 		while (i < pattern.length()) {
786 			char ch = pattern.charAt(i);
787 			if (Character.isDigit(ch)) {
788 				fgPkgNameChars = ch - 48;
789 				if (i > 0)
790 					fgPkgNamePrefix = pattern.substring(0, i);
791 				if (i >= 0)
792 					fgPkgNamePostfix = pattern.substring(i + 1);
793 				fgPkgNameLength = fgPkgNamePrefix.length() + fgPkgNameChars
794 						+ fgPkgNamePostfix.length();
795 				return;
796 			}
797 			i++;
798 		}
799 		fgPkgNamePrefix = pattern;
800 		fgPkgNameLength = pattern.length();
801 	}
802 
getPkgNamePatternForPackagesView()803 	private static String getPkgNamePatternForPackagesView() {
804 		IPreferenceStore store = PreferenceConstants.getPreferenceStore();
805 		if (!store
806 				.getBoolean(PreferenceConstants.APPEARANCE_COMPRESS_PACKAGE_NAMES))
807 			return ""; //$NON-NLS-1$
808 		return store
809 				.getString(PreferenceConstants.APPEARANCE_PKG_NAME_PATTERN_FOR_PKG_VIEW);
810 	}
811 }
812