tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
1018
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Crai Crai ist offline Mitglied Silber
    Registriert seit
    Aug 2004
    Beiträge
    67
    Hallo zusammen,

    ich habe folgendes kleines Problem:
    Wenn in Eclipse meine View geschlossen wird, möchte ich darauf reagieren können.

    Nun hab ich das Problem, dass ich keinen Punkt finde, an dem ich da einsteigen könnte.
    Gibt es keinen Listener der reagiert, wenn die View "geschlossen" (=setVisible(false)) wird?

    Mit der setFocus() Methode der View das leider net.

    Für jeden Tipp dankbar,
    Gruß,
    Crai
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Du koenntest deine View das org.eclipse.ui.ISaveablePart/org.eclipse.ui.ISaveablePart2 Interface implementieren lassen. Damit bekommst du Moeglichkeiten das Speichern der View beim schliessen zu steuern.

    Du koenntest auch einen PartListener in createPartControl implementieren:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
        /**
         * This is a callback that will allow us
         * to create the viewer and initialize it.
         */
        public void createPartControl(Composite parent) {
            viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
            viewer.setContentProvider(new ViewContentProvider());
            viewer.setLabelProvider(new ViewLabelProvider());
            viewer.setSorter(new NameSorter());
            viewer.setInput(getViewSite());
            makeActions();
            hookContextMenu();
            hookDoubleClickAction();
            contributeToActionBars();
            
            getViewSite().
            getPage().
            addPartListener(new IPartListener(){
                public void partActivated(IWorkbenchPart part) {
                    System.out.println("partActivated");                
                }
     
                public void partBroughtToTop(IWorkbenchPart part) {
                    System.out.println("partBroughtToTop");
                }
     
                public void partClosed(IWorkbenchPart part) {
                    System.out.println("partClosed");
                }
     
                public void partDeactivated(IWorkbenchPart part) {
                    System.out.println("partDeactivated");
                }
     
                public void partOpened(IWorkbenchPart part) {
                    System.out.println("partOpened");
                }
            });
        }

    Gruss Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    Crai Crai ist offline Mitglied Silber
    Registriert seit
    Aug 2004
    Beiträge
    67
    Hallo,

    danke an dich Thomas für deinen Tipp!
    Mein Problem etwas konkreter:
    In der View ist ein TreeViewer, dessen ContentProvider per Listener benachrichtigt wird,
    wenn sich Ressourcen im Workspace ändern. Dieser sollte aber nur benachrichtigt werden, wenn die View wirklich sichtbar ist(also nicht geschlossen wurde).

    Deine Lösung mit dem PartListener hörte sich auch echt recht gut an:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
            public void partDeactivated(IWorkbenchPart part) 
            {
                IViewPart fbStudioView = getViewSite().getWorkbenchWindow().getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID);
                if ((part instanceof FBStudioView) && !getViewSite().getWorkbenchWindow().getActivePage().isPartVisible(part))
                {
                    TreeViewer treeViewer = ((FBStudioView)part).getViewer();
                    try 
                    {
                        System.err.println("Listener removed!");
                        ResourcesPlugin.getWorkspace().removeResourceChangeListener((FBStudioContentProvider)treeViewer.getContentProvider());
                    } 
                    catch (Exception e) 
                    {
                        System.out.println("FBStudioView#createPartControl(...): ResourceChangeListener already be removed!");
                    }
                }
            }

    Nur ist die View zum Zeitpunkt, wenn ich mit isPartVisible abfrage noch sichtbar.
    Aber dieser Part sollte doch schon deactivated sein, oder

    Ein anderer Lösungweg war eine Modifikation der resourceChanged() Methode im ContentProvider:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
        public void resourceChanged(IResourceChangeEvent event) 
        {
            IViewPart dcbStudioView = null;
            IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
            for (int i=0;i<windows.length;i++)
            {
                IWorkbenchWindow window = windows[i];
                dcbStudioView = window.getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID); 
                if (dcbStudioView != null)
                {
                    boolean isVisible = window.getActivePage().isPartVisible(window.getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID));
                    if (isVisible)
                    {
                        processDelta(event.getDelta());
                    }
                }
            }
        }

    Dies löst aber in der Zeile
    Code :
    1
    
    window.getActivePage().isPartVisible(window.getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID));

    eine SWT Exception [org.eclipse.swt.SWTException: Invalid thread access] aus. Aber warum, wie wechsle ich den Thread, damit das nicht passiert?

    Gruß,
    Crai
     

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!


    eine SWT Exception [org.eclipse.swt.SWTException: Invalid thread access] aus. Aber warum, wie wechsle ich den Thread, damit das nicht passiert?
    Kann leider jetzt nicht danach schauen, aber du koenntest duese Anweisung auch innerhab eines
    Code :
    1
    2
    3
    4
    5
    
    Display.getCurrent().asyncExec(new Runnable(){
                    public void run() {
                        // TODO your code...
                    }
                });
    Code-Blocks ausfuehren.

    Aber weshalb musst du denn nochmal die passende View suchen? Bist du denn dort nicht innerhalb der View?

    Gruss Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  5. #5
    Crai Crai ist offline Mitglied Silber
    Registriert seit
    Aug 2004
    Beiträge
    67
    Vielen Dank Thomas,

    mit dem Display.asyncExec.... klappts!
    Ich bin in meinem ContentProvider, nicht in meiner View.

    Gruß,
    Crai
     

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 20.07.08, 14:58
  2. Wie kann man diese Edit View aufbauen?
    Von jonlee im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 05.07.08, 18:30
  3. Wie kann man per Button eine neue View anzeigen
    Von maxpower24 im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 14.12.05, 09:21
  4. Reagieren auf Schließen des IE Browserfensters möglich?
    Von mzuelch im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 21.01.05, 14:50
  5. Antworten: 6
    Letzter Beitrag: 08.07.04, 12:45