Sendungsliste - Navigation

Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: Sendungsliste - Navigation

Beitrag von Sheldon2012 »

Für die Zeilenanzahl sollte doch eigentlich ein simple "y++" reichen, oder?
Das klappt nämlich nicht.
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Sendungsliste - Navigation

Beitrag von ds10 »

Nein, das reicht nicht, das legt nur fest, in welcher Zeile die Komponente ist. Die Zeilen muss man vorher im FormLayout definieren.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: Sendungsliste - Navigation

Beitrag von Sheldon2012 »

Sorry, aber ich sehe es irgendwie nicht. Was ich im Code habe ist nur das.

Code: Alles auswählen


  FormLayout layout = new FormLayout("default,3dlu,100dlu:grow,3dlu,default","default,3dlu,fill:default:grow");
    
    setLayout(layout);
    
    setOpaque(false);
    
    if(type == TYPE_NAME_AND_PROGRAM_FILTER) {
      layout.insertRow(1, RowSpec.decode("default"));
      layout.insertRow(2, RowSpec.decode("3dlu"));
    }

Bitte verrate mir, wo ich die Zeilenanzahl hinterlege.
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Sendungsliste - Navigation

Beitrag von ds10 »

Eigentlich ist das ja sogar sprechender Quellcode:

Code: Alles auswählen

      layout.insertRow(1, RowSpec.decode("default"));
      layout.insertRow(2, RowSpec.decode("3dlu"));
Liest sich als: Layout.ZeileEinfügen(Zeilennummer, Zeilenformat);

Das kannst du ein weiteres Mal ohne Bedingung einfügen, damit du eine neue Zeile mit Standardhöhe (default) und eine Abstandszeile mit der Höhe 3dlu erhältst.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: Sendungsliste - Navigation

Beitrag von Sheldon2012 »

So hatte ich mir das auch gedacht! Aber wenn ich das ausprobiere, funktioniert es nicht.
Was mache ich denn da falsch?
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Sendungsliste - Navigation

Beitrag von ds10 »

Bekommst du denn keine Fehlermeldung? Normalerweise müsste eine Exception auftreten, wenn man eine Komponente einer nicht existierenden Zeile hinzuzufügen versucht.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: Sendungsliste - Navigation

Beitrag von Sheldon2012 »

Nein, die GUI wird nur nicht korrekt aufgebaut.
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Sendungsliste - Navigation

Beitrag von ds10 »

Dann fügst du die Komponenten vielleicht einfach nicht in die richtigen Zeilen ein, so dass sie z.B. in einer 3dlu-Zeile landen. 3dlu ist aber nur der Zwischenraum und damit sehr schmal, so dass man in der Regel nicht viel von den Komponenten sieht.

Du kannst auch testweise ein try{}catch(Throwable t) {t.printStackTrace();} um die Erstellung der GUI in createGui() legen um sicher zu gehen, auch wirklich keinen Fehler zu verpassen.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: Sendungsliste - Navigation

Beitrag von Sheldon2012 »

Gehen wir das Ganze doch mal systematisch Schritt für Schritt an.

Also nach ein wenig "Try and Error" wird die GUI richtig angezeigt. Aber irgendwie ist das immer noch seltsam.
Das kann doch nicht so gedacht sein, oder? Irgendwo habe ich da noch einen Denkfehler.
Vielleicht schaust Du Dir das mal an.

Code: Alles auswählen


 private void createGUI(int type, boolean showNumberOfPrograms, int startType, ProgramFilter startFilter) {
    FormLayout layout = new FormLayout("default,3dlu,100dlu:grow,3dlu,default","default,3dlu,fill:default:grow");
    
    setLayout(layout);
    
    setOpaque(false);
    
    if(type == TYPE_NAME_AND_PROGRAM_FILTER) {
      layout.insertRow(1, RowSpec.decode("default"));
      layout.insertRow(2, RowSpec.decode("3dlu"));  
      layout.insertRow(1, RowSpec.decode("default"));
      layout.insertRow(2, RowSpec.decode("3dlu")); 
      layout.insertRow(1, RowSpec.decode("default"));
      layout.insertRow(2, RowSpec.decode("3dlu")); 
    }
    
    int y = 1;   
        
    Channel[] subscribedChannels = Plugin.getPluginManager().getSubscribedChannels();
    mChannelBox = new WideComboBox();
    
    mChannelBox.addItem("Alle");
    for (int i = 0; i < subscribedChannels .length; i++) {
       mChannelBox.addItem (subscribedChannels[i]);
    }
    if (mSelectedChannel != null) {
      mChannelBox.setSelectedItem(mSelectedChannel);
    }    
     
    mChannelBoxLabel = new JLabel("Sender");   
    
    add(mChannelBoxLabel , CC.xy(1, y));
    add(mChannelBox , CC.xyw(3, y, 3));  
    
    y+=2;

    mProgramFilterBox = new WideComboBox();
    
    if(type == TYPE_NAME_AND_PROGRAM_FILTER || type == TYPE_PROGRAM_ONLY_FILTER) {
      mProgramFilterBox.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
          if(e.getStateChange() == ItemEvent.SELECTED) {
            filterPrograms((ProgramFilter)mProgramFilterBox.getSelectedItem());
            scrollToFirstNotExpiredIndex(false);
          }
        }
      });
      
      fillProgramFilterBox(startType, startFilter);
      
      JButton refresh = new JButton(TVBrowserIcons.refresh(TVBrowserIcons.SIZE_SMALL));
      refresh.setToolTipText(LOCALIZER.msg("refresh", "Refresh list with current filter"));
      refresh.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
          filterPrograms((ProgramFilter)mProgramFilterBox.getSelectedItem());
        }
      });      
      
      long refreshDureation = 10*60*1000; // refresh duration in milliseconds set to 10 minutes
      Timer timer = new Timer();

      timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
          filterPrograms((ProgramFilter)mProgramFilterBox.getSelectedItem());
        }
      }, refreshDureation, refreshDureation);      
      
      mProgramFilterLabel = new JLabel(LOCALIZER.msg("filterPrograms", "Program filter:"));
      
      add(mProgramFilterLabel, CC.xy(1, y));
      add(mProgramFilterBox, CC.xy(3, y));
      
      add(refresh, CC.xy(5, y));
      
      y+=2;
    }
    else {
      mProgramFilterBox.addItem(FilterManagerImpl.getInstance().getAllFilter());
    }      
    
    if(type == TYPE_NAME_AND_PROGRAM_FILTER || type == TYPE_NAME_ONLY_FILTER) {
      mTitleFilterBox = new WideComboBox();
      mTitleFilterBox.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
          if(e.getStateChange() == ItemEvent.SELECTED) {
            filterPrograms((ProgramFilter)mTitleFilterBox.getSelectedItem(), true);
            scrollToFirstNotExpiredIndex(false);
          }
        }
      });
      
      mTitleFilterLabel = new JLabel(LOCALIZER.msg("filterTitles","Title filter:"));

      add(mTitleFilterLabel, CC.xy(1, y));
      add(mTitleFilterBox, CC.xyw(3, y, 3));
      
      y+=2;       
    }  
        
    
    if(showNumberOfPrograms) {
      layout.insertRow(y, RowSpec.decode("default"));
      layout.insertRow(y+1, RowSpec.decode("3dlu"));
      
      mNumberLabel = new JLabel(LOCALIZER.msg("numberOfPrograms", "Number of shown programs: {0}", 0));
      
      add(mNumberLabel, CC.xyw(1, y, 5));
    }
       
    mProgramListScrollPane = new JScrollPane(mProgramList);
    mProgramListScrollPane.setBorder(null);   
     
    y+=4;        
    
    add(mProgramListScrollPane, CC.xyw(1, y, 5));
  }  

Nun habe ich eine public-Methode gebaut, die einen Channel annimmt und in ein Feld der Klasse schreibt.

Code: Alles auswählen


  public void setSelectedChannel(Channel selectedChannel) {
	  mSelectedChannel = selectedChannel;
  }

Diesen selektierten Channel übernimmt ja dann die Combobox.
Aber wo muß ich die nun aufrufen. Das habe ich noch nicht gefunden.

Die Implementierungen für den Label-Text "Sender" und den Eintrag "Alle " sind auch noch stark verbesserungswürdig.
Vielleicht hast Du dafür auch eine Idee. Irgenwo muß das Ding doch ein Property-File haben.
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Sendungsliste - Navigation

Beitrag von ds10 »

Du musst den Sender nicht als Klassenvariable abspeichern, denn du hast ja schon die Combobox als Klassenvariable, bei der kannst du einfach getSelectedItem() abfragen und natürlich auch in der Methode setSelectedChannel den ausgewählten Sender der Combox mit setSelectedItem(Channel) setzten. Da auf der Combobox ein ItemListener registriert ist, wird bei jeder Änderung des ausgewählten Senders der ItemListener ausgelöst, der dann die Methode zum Neuaufbau der Liste auslöst.

In der Methode, die die Liste füllt, musst du dann natürlich den ausgewählten Sender der Combobox abfragen und mit den Sendern der Sendungen vergleichen um die dann entsprechend zu filtern. Um den Aufruf von extern um über die Senderliste den auszuwählen brauchst du dich noch gar nicht kümmern solange du nicht mit der Combobox selbst die Filterung erfolgreich durchführen kannst.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: Sendungsliste - Navigation

Beitrag von Sheldon2012 »

Das Filtern mit dem entsprechennde Sender habe ich hinbekommen. Nun fehlt eigentlich nur noch der externe Aufruf.
Wo muß ich meine public-Methode setSelectedChannel(Channel selectedChannel) denn aufrufen?
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Sendungsliste - Navigation

Beitrag von ds10 »

In FavoritesPlugin.java gibt es in Zeile 193 ein PluginCenterPanelWrapper, dort musst du die Methode public void scrolledToChannel(Channel channel) { überschreiben, die wird von TV-Browser aufgerufen, wenn ein Sender in der Liste angeklickt wird. Das läuft dann genau wie bei filterSelected in der gleichen Klasse.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: Sendungsliste - Navigation

Beitrag von Sheldon2012 »

Also ich hab edas mal mit diesem Ansatz vrsucht, aber der Konstruktor muß wohl anders gefüllt werden, oder?
Das klappt nämlich nicht.

Code: Alles auswählen


      @Override
      public void scrolledToChannel(Channel channel) {
    	  FilterableProgramListPanel filterableProgramListPanel = new FilterableProgramListPanel(0, null, false, false, null, 0);
       	  filterableProgramListPanel.setSelectedChannel(channel);     	  
      }

ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Sendungsliste - Navigation

Beitrag von ds10 »

Das Panel gibt es schon, das musst du da nicht neu anlegen. Ich schrieb ja, dass du es analog zur Methode filterSelected(ProgramFilter) in PluginCenterPanelWrapper umsetzen kannst.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: Sendungsliste - Navigation

Beitrag von Sheldon2012 »

Dann verstehe ich Dich gerade nicht.

filterSelected(ProgramFilter filter) wird so überschrieben

Code: Alles auswählen


      @Override
      public void filterSelected(ProgramFilter filter) {
        if(mMangePanel != null && reactOnFilterChange()) {
          mMangePanel.selectFilter(filter);
        }
      }
Ich brauche aber doch ein FilterableProgramListPanel und eclipse sagt mir, dass er das nicht hat.
Wo ist mein Denkfehler?
Antworten