/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package org.onosproject.ui.impl;

import org.onosproject.ui.UiTopoOverlay;
import org.onosproject.ui.topo.ButtonId;
import org.onosproject.ui.topo.PropertyPanel;

/**
 * Topology Overlay for network traffic.
 */
public class TrafficOverlay extends UiTopoOverlay {
    private static final String TRAFFIC_ID = "traffic";

    private static final String SDF_ID = "showDeviceFlows";
    private static final String SRT_ID = "showRelatedTraffic";

    private static final ButtonId SHOW_DEVICE_FLOWS = new ButtonId(SDF_ID);
    private static final ButtonId SHOW_RELATED_TRAFFIC = new ButtonId(SRT_ID);


    public TrafficOverlay() {
        super(TRAFFIC_ID);
    }

    @Override
    public void modifyDeviceDetails(PropertyPanel pp) {
        pp.addButton(SHOW_DEVICE_FLOWS)
            .addButton(SHOW_RELATED_TRAFFIC);
    }

}
