2012-04-26 5 views
0

Мой сайт имеет слева дерево GWT. В центре находится GWT-TabBar.GWT несколько видов деятельности/мест с одним токеном

Обе части выполнены в виде Views/Activities/Places. У меня есть два токенизатора: «m» для дерева и «t» для вкладок.

Если я нахожусь в одном месте (goTo()), только это место будет использоваться для создания токена истории. Но я хотел бы видеть это: <page>#m:sub/sub/sub;t:map

Я действительно думал, что дырка идея деятельности & мест. Я не вижу смысла иметь множественный токенизатор, когда только один токенизатор может одновременно предоставить токен.

ответ

3

Вы не можете отображать два разных токена #m: и #t: одновременно вы не можете находиться в двух местах одновременно.

Таким образом, если одновременно отображаются обе вкладки и дерево, то состояние обоих должно быть сохранено одновременно в одном и том же месте.

Это более или менее то, что вам нужно.

public class ExamplePlace extends Place { 

    public String treePosition = "/"; 

    public int tabIndex = 0; 

    public ExamplePlace() { 
     super(); 
    } 

    public ExamplePlace(String treePosition, int tabIndex) { 
     this.treePosition = treePosition; 
     this.tabIndex = tabIndex; 
    } 

    @Prefix("overview") 
    public static class Tokenizer implements PlaceTokenizer<ExamplePlace> { 


     /** 
     * parse token to get state 
     * 
     */ 
     @Override 
     public ExamplePlace getPlace(String token) { 
      String treePosition = ""; 
      int tabIndex = 0; 
      String[] states = token.split(";"); 
      for (String state : states) { 
       String[] mapping = state.split("="); 
       if (mapping.length == 2) { 
        if ("t".equals(mapping[0])) { 
         treePosition = mapping[1]; 
        } 
        if ("m".equals(mapping[0])) { 
         try { 
          tabIndex = Integer.valueOf(mapping[1]); 
         } catch (Throwable e) { 
         } 
        } 
       } 
      } 
      return new ExamplePlace(treePosition, tabIndex); 
     } 


     /** 
     * store state in token 
     * 
     */ 
     @Override 
     public String getToken(ExamplePlace place) { 
      StringBuffer sb = new StringBuffer(); 
      if (place.getTreePosition()!=null) { 
       sb.append("t").append("=").append(place.getTreePosition()); 
       sb.append(";"); 
      } 
      sb.append("m=").append(place.getTabIndex()); 
      return sb.toString(); 
     } 

    } 

    public String getTreePosition() { 
     return treePosition; 
    } 

    public void setTreePosition(String treePosition) { 
     this.treePosition = treePosition; 
    } 

    public int getTabIndex() { 
     return tabIndex; 
    } 

    public void setTabIndex(int tabIndex) { 
     this.tabIndex = tabIndex; 
    } 

} 

Это даст вам URL-адреса, которые выглядят;

index.html # Обзор: т =/поддерево/поддерево/лист; т = 2

Вы можете столкнуться в неприятности с слэша в маркере, не уверен. При необходимости измените их на какой-либо другой символ;

Активность получает входящее место и вводит состояние в вид;

+0

Хм, я боюсь, что это будет единственное решение! Прежде чем я обнаружил, что GWT - «Действия/Места», я реализую сопоставимый подход случайно (но с несколькими «местами»). Неважно. Теперь я знаю, что я ничего не пропустил в документах! Благодарю. –

+0

Важным является то, что вы не можете быть в нескольких местах одновременно, только несколько областей отображения, которые управляются индивидуальными действиями. место определяет, какие действия активированы. – koma